DateTimeクラスでUNIXタイムを使うときの罠

PHPDateTimeクラスUNIXタイムからもインスタンスを生成することができる。

$date_time = new DateTime('@' . time());

といった感じで。

@マークを先頭につけないといけないのはPHPマニュアルに書いてあるんだけど、この前、はまった罠はタイムゾーン

手を動かして覚えるPHP 5.3新機能 日付(DateTime,DateInterval)編 | Act as Professional - hiroki.jp by HIROCASTER

を読んで知ったのだけど、UNIXタイムで生成するとタイムゾーンUTCになるみたい。

確かに試してみたら、タイムゾーンを設定しなおしてやらないと日本時間にならなかった。


<?php

$string_time = '2013-01-17 00:00:00';

$time = strtotime($string_time);

//UNIXタイムに変換したものからインスタンスを作ってみる
$date_time = new DateTime('@' . $time);

echo $date_time->format('Y-m-d H:i:s');
//2013-01-16 15:00:00と表示される


//タイムゾーンを設定しなおす
$date_time->setTimezone(new DateTimeZone('Asia/Tokyo'));

echo $date_time->format('Y-m-d H:i:s');
//2013-01-17 00:00:00と表示されて一致する


//文字列から直接作ってみる
$date_time_from_string = new DateTime($string_time);
echo $date_time_from_string->format('Y-m-d H:i:s');
//2013-01-17 00:00:00と表示されて一致する