LoginSignup
11
13

More than 5 years have passed since last update.

DateTimeオブジェクトにUNIXタイムスタンプとタイムゾーンを指定した時の挙動に関する備忘録

Last updated at Posted at 2013-04-22

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) でどんな差があるか詳しく知らないんですけど、現状の僕の知識ではこの仕様に対して納得のいく説明がつかないのでモヤモヤしています。

そうたろうに聞いたらそんな感じの議論どっかでみたとかいってたのでなんか理由あるのかなー。

11
13
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
13