[0] PHP53においてtimezoneをAsia/Tokyo設定した場合話。-[Id of Radiance ver.5]





■ PHP53においてtimezoneをAsia/Tokyo設定した場合話。

 久々にPHP話だよ!

 CentOS5系列最後の方をベースに、毎度おなじみZnedFramework+Smarty+PostgreSQL環境で開発しております。
 このディストリになるとインストされるPHPを5.1.6系列か53系列かを選択できる。まあ一部足りないモノがあったりもするのだが、この間には越えられない壁があると判断。
 またPostgreSQLも8.1系列と8.4系列を選択できる。ここにも超えられない壁…というか今回xml型を使いたかったので8.4を選択。まあこの2者のため「PHP53からPostgreSQL84につなぐ」ための設定に少し手間取ったりもしたがそう大した話ではない。

 さてちまちま開発する中でそりゃ使うだろうという関数が日付関数「date」。今まで一度も使わなかった事はないね、とゆーくらい頻繁に使うこの関数だが、今回デフォのphp.ini設定のまま使うと
Warning: date() [function.date]: It is not safe to rely on the system's timezone settings.(中略)
とか表示される。まあWarning非表示にして無視するという選択肢もあるが、標準的な手法としては設定ファイルphp.iniの「date.timezone」に適切な値を設定すれば良い、ということらしい。らしいので日本標準時を指定する「Asia/Tokyo」を設定し再起動…うむ、エラーは出なくなった。


 …と、一般の手法で上手くいかないのが私のパターンw

 確かにエラーは出なくなった。が、なんか表示される時間がおかしい。
 気づいたのはPostgreSQLに設定された時間がずれていた事。当初はてっきりPostgreSQL側のtimezone設定がおかしいものと思って調整したが変わらず。と言うか「select date();」で普通にJST返ってくるし。
 上述のphp.iniの書き方がおかしいのかなー、と思い色々試すが変化なし。が、ここで先日遭遇したCentOS自身のtimezoneを指定する「localtime」がおかしいよ話を思い出す。ひょっとしてPHPもここの解釈おかしくなってんじゃないか?と言うかどっかでまとめて時間管理してるのか?と思い、試しにphp.iniに時差の少ないであろー「Asia/Seoul」を設定したところ本来のJSTに近い時間が表示された。やっぱりかAAAAAAAAA!!!!
 ちなみに見たところ「Asia/Tokyo」設定で返されるのはGMT-5時間くらい。位置的にはペルーとかの南米付近で間違いようがない…のだが敢えて間違う可能性があるとすると同じ「Ja」から始まる「Jamaica」と取り違えた…のだろうか…。

 しかしこんな話が一般的だったらもっと世の中騒いでてもいいはずだが、軽く調べた限りこんな事で困ってる人はいないようだなぁ。なんかウチの環境だけ特殊なんだろうか。日本限定で。
 そしてこれの対策は…どうしたもんかなぁ…w


追記:
 対処方法編。基本的には前のCentOS・/etc/localtimeと同様。このファイルの本来のコピーorシンボリックリンク元であるところの「/usr/share/zoneinfo/Asia/Tokyo」をどうやらPHPは参照しているらしい。なのでコレを前回同様1つ前のソレと置き換えればOK。
 …しかしなんでこれだけこんな状況なんだか。「yum update」でまとめて更新するとこの間違ったファイルに置き換わってしまうようだが。他国の嫌がらせかw

2012-01-19 [技術]

関連記事: