pubDate で JST を指定し日本の現地時刻で RSS2.0 を作成した場合、 Akregator が9時間未来の記事として表示する問題について、いろいろ調べてみた。

結局、時差の指定部分は GMT でなければ日時を正常に認識しないということが分かった。

そこで、記事の日時の UNIX タイムスタンプを、 gmmktime() で一旦 GMT でのタイムスタンプに変換し、そのタイムスタンプを strftime() に渡すようにしてみたが、作成された日時に変化がなかった。

おかしいな、と思い、調べてみたところ、私の使っているサーバは setlocale() に 0 (失敗)を返すことが分かった。

setlocale(LC_ALL, 0) などとして現在のロケールを取得してみたが、帰ってきたのは "C" だけだった。

どうしようもないので、 setlocale() に失敗するサーバの場合の処理として、記事の UNIX タイムスタンプから、予め定義しておいた定数分だけ固定で差し引きし strftime() に渡すようにした。時差を表す表記部分も、 %Z が指定されていたら GMT に置き換えるようにした。なんのための setlocale(), strftime() なのかさっぱり分からなくなってしまったが、しょうがない。

とりあえず、これで Akregator は今度こそ正しい公開日時を表示してくれるようになった。

それにしても、時差の表記に GMT しか使えないのは、 RSS2.0 の pubDate の仕様なのだろうか。それとも、RSSフィードリーダの実装上の怠慢なのだろうか。

本来ならば、読み取った時差の表記に従って、一旦 GMT での日時に変換し、起動しているフィード・リーダが現在取得したロケールでの日時に変換し表示する、という処理が正しいのではなかろうか。

ちなみに、前の記事で書いた、

そこで、ちょっと考えて、 "en_JP.utf8" と記述してみたら、見事英語で日本の時差で表示してくれた。ネットで検索しても、このような表記についての説明は皆無だったが、ロケールの表現方法が、「言語_地域.エンコード」という形式であることから試してみたのだが、 PHP7 はしっかり対応してくれていた。 PHP7 さすがである。

だが、単に setlocale() はエラーを返し、もともと英語表記だったので曜日部分も Sun と表示されただけのようだ。 ja_JP.utf8 を指定した場合に曜日部分が「日」と表示されたのは、 setlocale() の指定ができないサーバ用に自前で日本語表記に置き換えるよう rNote がもとからもっていたコードによって表示されていた。

お名前:

URL または e-mail (option):

CAPTCHA Image 左の画像内の式の計算結果を入力:
TWEET
この記事のリンク元

この記事のリンク用URL&トラックバックURL : https://red-souls.jp/ichounoki/rnote/works/software/20190819_095325157109.htm