PHPでUnix時間からDateTimeオブジェクトを作るときのタイムゾーン設定
はまったのでメモ。
UnixタイムからDateTimeオブジェクトを作るときに、他のやり方と同じノリでタイムゾーンを第二引数に渡しても効いていなかった。
一応、マニュアルにも書かれていた。
PHP: DateTime::__construct - Manual
注意:
$time パラメータが UNIX タイムスタンプ (@946684800 など) であったりタイムゾーンつきで指定した場合 (2010-01-28T15:00:00+02:00 など) は、 $timezone パラメータや現在のタイムゾーンは無視されます。
でもこんなのわかんないよ!
動かなった例
<?php $now = time(); //=> 1431442116 (2015-05-12T23:48:36+09:00) $d = new DateTime('@'.$now, new DateTimeZone('Asia/Tokyo')); $d->modify('+1day'); print_r( $d->format('c') ); //=> 2015-05-13T14:48:36+00:00 // 第二引数のタイムゾーンが効かずデフォルトのUTCになっている
動いた例
素直に分けて、setTimeZone経由でタイムゾーンを変更する。
<?php $now = 1431442116; //=> 2015-05-12T23:48:36+09:00 $d = new DateTime('@'.$now); $d->setTimeZone(new DateTimeZone('Asia/Tokyo')); // 分ける! $d->modify('+1day'); print_r( $d->format('c') ); //=> 2015-05-13T23:48:36+09:00
ちなみにUnixタイムでなければ、ちゃんと第二引数のタイムゾーンは効く。
<?php $d = new DateTime('2015-05-12T23:48:36+09:00', new DateTimeZone('Asia/Tokyo')); $d->modify('+1day'); print_r( $d->format('c') ); //=> 2015-05-13T23:48:36+09:00