rNote の rnote_config.php の初期設定では、

define("DATETIME_LOCALE", 'ja_JP.UTF8');

と書かれているのだが、これだと setlocale() がエラーでこける。

サーバのコンソールで locale -a で見てみると、ja_JP.UTF8 ではなく ja_JP.UTF-8 だったので、同じ記述になおしたところ setlocale() が通るようになった。サーバによって jp_JP.UTF-8 だったり、 ja_JP.UTF8 だったりするのだろうか?

ちなみに、 setlocale(LC_ALL, "ja_JP.UTF-8"); を実行した返り値を見ると、

”.ja_JP.UTF-8.”

となっている。両端のダブルクォーテーションとドットはなんだろう?

予想としては、

ja_JP.UTF-8

のような形で返ってきて欲しかったのだが・・・。百歩譲ってダブルクォーテーションで括られているのはよいとしても、ドットの意味が分からない。まあ、この返り値をどうこうするつもりはないので、エラーでないことが分かれば中身はどうでもいいのだが。

次に、

ただ、 "ja_JP.utf8" を、英語表記にするために "en_US.utf8" としたら、時刻もずれてしまう。

についてだが、どうやら strftime() の時刻に関しては setlocale() で en_US.UTF-8 と指定しても日本時とずれないようだ。そして、 gmstrftime() という今回の用途にぴったりの関数もあることが分かった。これを使えば、

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

の処理は不要になる。ただし、 %Z で指定されるタイムゾーン文字列だけは問題で、setlocale(LC_TIME, "en_US.UTF-8"); gmstrftime(); とした場合、日時は GMT での日時として出力されたが、タイムゾーンは JST と出力されてしまった。

このことからも、 strftime(), gmstrftime() は setlocale() の結果を、日時の表示形式のためにしか参照しないようだ。そして、 JST と出力されていることと、 gmstrftime() で正しい GMT での日時が出力されることから、 strftime(), gmstrftime() がタイムゾーンを考慮して日時を修正する方法は、なにか別の方法をとっているらしい。

その「別の方法」が不明なので、とりあえず今のところは %Z を GMT と置換することで対処しておくことにする。

この記事のリンク元 | 9 | 8 |

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


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 がもとからもっていたコードによって表示されていた。

この記事のリンク元 | 9 | 8 |

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