DateTime
オブジェクト生成時、第1引数に UNIX タイムスタンプを指定した場合、 第2引数にどんなタイムゾーンを指定しようとオブジェクトにはタイムゾーンが設定されない:
% php -a
Interactive shell
php > var_dump((new DateTime('2013/02/20', new \DateTimeZone('Asia/Tokyo')))->getTimestamp());
int(1361286000)
// なぜか日付がずれる
php > var_dump((new DateTime('@1361286000', new \DateTimeZone('Asia/Tokyo')))->format('Y/m/d'));
string(10) "2013/02/19"
// date() だとずれない
php > var_dump(date('Y/m/d', 1361286000));
string(10) "2013/02/20"
// Timezone が設定されていない!!
php > var_dump((new DateTime('@1361286000', new DateTimeZone('Asia/Tokyo')))->getTimezone()->getName());
string(6) "+00:00"
// インスタンス化後に DateTime::setTimezone() でタイムゾーンを設定しなければならない
php > var_dump((new DateTime('@1361286000'))->setTimeZone(new \DateTimeZone('Asia/Tokyo'))->format('Y/m/d'));
string(10) "2013/02/20"
UNIXタイムスタンプにはタイムゾーンという概念がないことはわかってるけど、 DateTime
オブジェクト的には保持しておくのがベターだと思うなー。
確かにドキュメントにも書いてあるんですけどねー。
http://www.php.net/manual/ja/datetime.construct.php
$time
パラメータが UNIX タイムスタンプ (@946684800
など) であったりタイムゾーンつきで指定した場合 (2010-01-28T15:00:00+02:00
など) は、$timezone
パラメータや現在のタイムゾーンは無視されます。
逆に、設定されると問題になることって何かあるんですかね? new DateTime($time, $timezone)
と new DateTime($time)->setTimeZone($timezone)
でどんな差があるか詳しく知らないんですけど、現状の僕の知識ではこの仕様に対して納得のいく説明がつかないのでモヤモヤしています。
そうたろうに聞いたらそんな感じの議論どっかでみたとかいってたのでなんか理由あるのかなー。