2009年1月26日月曜日

PHPの DateTimeZoneオブジェクトで時差のある時間を計算

日本の時間でDateTimeオブジェクトを生成して、時差のある地域の現地時間を求める方法。

setTimeZone('EST') とかできそうだけど、わざわざDateTimeZoneオブジェクトを生成しないといけない。

//日本の現在の時刻とアメリカ東海岸の現地時刻の比較
$dt = new DateTime('now');
echo $dt->format('r'); //日本の時間(デフォルトはAsiz/Tokyoにしてあるので)
echo "<hr />\n";
$dt->setTimeZone(new DateTimeZone('America/New_York'));
echo $dt->format('r'); //アメリカ東海岸の時間

//向こうの現地時刻から日本の時刻に変換する場合
$dt = new DateTime('2008-12-09 23:22:44', new DateTimeZone('America/New_York'));
$dt->setTimeZone(new DateTimeZone('Asia/Tokyo'));
echo $dt->format('r');
このあたりのマニュアル、分かり辛い。

また、夏時間も自動で考慮してくれるようだ。
for ($i = 1; $i < 13; $i++) {
 $dt = new DateTime("2008-$i-11 0:00");
 echo '[日本] ' . $dt->format('Y-m-d H:i:s');

 $dt->setTimezone(new DateTimeZone('America/New_York'));
 echo ' [EST] ' . $dt->format('Y-m-d H:i:s');

 echo ' [offset] ' . ($dt->getOffset() / 60 / 60) . '時間<br />';
}
(結果)アメリカのサマータイムって3月から10月なんだ。
[日本] 2008-01-11 00:00:00 [EST] 2008-01-10 10:00:00 [offset] -5時間
[日本] 2008-02-11 00:00:00 [EST] 2008-02-10 10:00:00 [offset] -5時間
[日本] 2008-03-11 00:00:00 [EST] 2008-03-10 11:00:00 [offset] -4時間
[日本] 2008-04-11 00:00:00 [EST] 2008-04-10 11:00:00 [offset] -4時間
[日本] 2008-05-11 00:00:00 [EST] 2008-05-10 11:00:00 [offset] -4時間
[日本] 2008-06-11 00:00:00 [EST] 2008-06-10 11:00:00 [offset] -4時間
[日本] 2008-07-11 00:00:00 [EST] 2008-07-10 11:00:00 [offset] -4時間
[日本] 2008-08-11 00:00:00 [EST] 2008-08-10 11:00:00 [offset] -4時間
[日本] 2008-09-11 00:00:00 [EST] 2008-09-10 11:00:00 [offset] -4時間
[日本] 2008-10-11 00:00:00 [EST] 2008-10-10 11:00:00 [offset] -4時間
[日本] 2008-11-11 00:00:00 [EST] 2008-11-10 10:00:00 [offset] -5時間
[日本] 2008-12-11 00:00:00 [EST] 2008-12-10 10:00:00 [offset] -5時間


タイムゾーンは"EST"とかの方が分かりやすいが、
ここに挙げられているタイムゾーン (UTC 以外のもの) は使用しないでください。 これらは過去のバージョンとの互換性のためにのみ残されています。
とあるのでやめましょう。


参考:
 PHP: timezone_open - Manual
 PHP: date_timezone_set - Manual

0 件のコメント:

ブログ アーカイブ

tags