読者です 読者をやめる 読者になる 読者になる

Perl日記

PerlとかRubyとかPHPとかPythonとか

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