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 と置換することで対処しておくことにする。

お名前:

URL または e-mail (option):

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

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