解せない日付処理

海外サーバを利用する上で欠かせないのが日付処理での一工夫だ。例えばアメリカのレンタルサーバを利用した場合、当然サーバはアメリカの現地時間に設定されている。だから、例えば掲示板プログラムを設置した場合、例えば日本でお昼の14時に投稿していたとしても、プログラムで何の工夫もされていなければ、深夜の1時に投稿した、というような具合で記録、表示されることになるだろう。海外のサーバを使う際は時差の処理が大切になってくる。

PHP5の場合はデフォルトのタイムゾーンを設定する「date_default_timezone_set」など有用な関数が装備されたので、最初に宣言すれば気にせずdate関数などを使用することができそうだ。しかしPHP4の場合はそうもいかない。やはり一工夫しなければいけないのだ。

実はこのようなことを考えていて、PHP標準で備わっている関数をいくつか試したのだが、解せない結果となって驚いている。実行したのは以下のようなプログラムだ。

(1) print(date(“Y-m-d H:i:s”,gmmktime()));
(2) print(date(“Y-m-d H:i:s”,mktime()));
(3) print(date(“Y-m-d H:i:s”,gmdate(‘U’)));
(4) print(date(“Y-m-d H:i:s”,date(‘U’)));
(5) print(gmdate(‘Y-m-d H:i:s’));
(6) print(date(‘Y-m-d H:i:s’));

GMTで処理して、逐一タイムゾーンにあわせて処理すればよいはず、と考えて上記プログラムがどのような結果になるのか試してみたのだが、意外な結果となった。

まずこれをアメリカのサーバで試すと以下の結果となった。

(1) 2008-04-08 20:28:11
(2) 2008-04-09 00:28:11
(3) 2008-04-09 00:28:11
(4) 2008-04-09 00:28:11
(5) 2008-04-09 04:28:11
(6) 2008-04-09 00:28:11

日本のPHP5サーバで試すとこんな結果になった。
(1) 2008-04-09 13:28:11
(2) 2008-04-09 13:28:11
(3) 2008-04-09 13:28:11
(4) 2008-04-09 13:28:11
(5) 2008-04-09 04:28:11
(6) 2008-04-09 13:28:11

日本のPHP4サーバで試すとこんな結果になった。
(1) 2008-04-09 22:28:11
(2) 2008-04-09 13:28:11
(3) 2008-04-09 13:28:11
(4) 2008-04-09 13:28:11
(5) 2008-04-09 04:28:11
(6) 2008-04-09 13:28:11

個人的には(1)(3)(5)は全部同じ値になって、(2)(4)(6)は時差の分だけ考えれば同じ値となる、と思っていたのだが(1)(3)(5)が期待と大きく異なる結果となった。

サーバの設定とかいろいろあるとは思うが原因がわからない(ひょっとしたら大きな勘違いをしているのかもしれないが)。とりあえず全部で同じ値を返した(5)を使うのがよさそうだ。今後しばらくはこの関数をベースに時差調整のプログラムを書くことにしよう。

コメントを残す


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net