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&トラックバックURL : https://red-souls.jp/ichounoki/rnote/works/software/20190819_214621530898.htm