PHPのタイムゾーンの不思議

 おうちサーバにインストールしているmoblog書きこみプログラム(おうちサーバの特定のアドレスにメールを送るとその内容をはてなダイアリーに書きこむ仕組み)で朝9時までが前日の日付になってしまう。つまりはGMTになってしまう。とりあえずはプログラム中にdate_default_timezone_set("Asia/Tokyo");しておけば問題は解決した。
 原因を探るべくいろいろいじっていたが、シンプルなプログラムならJMTのままだが、プログラム内容によってはGMTに変更されてしまうようだ。ではどこが原因だろうかとmoblog書きこみプログラムをベースにしたものを1行ずつコメントアウトにしてしらみつぶしにして調べてみた。結論としてはcurl_setopt関数でCURLOPT_COOKIEFILEを設定した時に限ってGMTに戻ってしまうようだ。同じcurl_setopt関数でも他の定数を指定した場合は戻らない。
 この場合、その前にdate_default_timezone_set("Asia/Tokyo");してあればGMTに戻らない。php.iniで指定してあっても無視される。
 php(5.2.2)のバグが、curlのバグか、それとも仕様か。

 マニュアルによると

注意: PHP 5.1.0 以降(日付/時刻 関数が書き直されてから)、タイムゾーンを 正しく設定せずに日付/時刻関数をコールすると E_NOTICE が発生し、またシステムの設定や TZ 環境変数を 使用すると E_STRICT が発生するようになりました。

 ということだけど、php.iniは設定しているし、NOTICEもSTRICTも発生していないしなぁ。


 とりあえず対応はできているからいいんだが、ちょっと気になる。