質問: 東京のunixtime が返ると思ったのに... var_dump($utcDate->getOffset()); echo("\n"); ``` ### 試したこと http://codepad.org/VDaCKgL3 ### 補足情報(FW/ツールのバージョンなど) // output string(23) "2018-08-13 14:37:01 UTC" string(10) "1534168897" int(0) string(30) "2018-08-13 23:37:01 Asia/Tokyo" string(10) "1534168897" int(32400) string(23) "2018-08-13 00:00:00 UTC" string(10) "1534118400" int(0) string(30) "2018-08-13 00:00:00 Asia/Tokyo" string(10) "1534086000" int(32400) string(23) "2018-08-13 09:00:00 UTC" string(10) "1534150800" int(0)
回答: > > (1) は 同じunixtimeが返って、(2)は違うunixtimeが返って...? > > なぜ挙動が変わるのかわからず、教えて頂きたいです。 > > > 1. unixtimeは「UTCの」1970年1月1日0時0分0秒からの経過秒数のことです。 そのため、どんなタイムゾーンであってもnowを指定すれば常に同じunixtimeが取得されます。 イメージとしては、ロンドンと日本で電話で話しながら「現時点でのUTC1970年1月1日0時0分0秒からの経過秒数」をお互い言いあうようなものです。(国際電話の遅延は無視するとして)同じ秒数を言い合うことになるはずです。 2. (2)では、それぞれのタイムゾーンの2018-08-13 00:00:00からunixtimeを逆算しています。 これは、日本とロンドンでそれぞれ「日付が変わった瞬間のUTC1970年1月1日0時0分0秒からの経過秒数」をそれぞれ言い合っているようなものなので、日本の方が日付が変わる瞬間は早く到達します。 > > また、(3)で UTCからtzDiff時間前後させた値 == 求めたいunixtime を出力するには、 > > intval($utcDate->format('U')) + ($tzDiff * 60 * 60) = 求めたいunixtime > > > tzDiffがサマータイム等を考慮しない純粋な時間の差という事であればその通りです。 ただ、質問冒頭の > > 日付文字列の時刻をUTCとして、timezone の分だけ前後したunixtime を出力したいのですが... > > > というのがuniximeの定義への誤解に基づく仕様な気がするので、最終的にどういうことをしたいのかを追記されると良いと思います。 追記に対する回答 > > 日付文字列とtimezoneを現した数値があります(Asia/Tokyoなら+9、America/Pacificなら-8)。 > > 他から受け取ったunixtimeの値と比較して、片方より未来か過去かを判定しようとしています。 > > 同じ形式で出力してそれを比較すれば良いと思い、 > > 日付文字列とtimezone の値をunixtimeへ変換しようとしたのですが... > > > この発想は正しいので、(2)の方法でそれぞれDateTimeオブジェクトを作ってunixtimeで比較するか、 オブジェクトをそのまま比較(こんなことできるんですね)すればどちらが未来かわかりますね。 (2)の場合、 string(23) "2018-08-13 00:00:00 UTC" string(10) "1534118400" と string(30) "2018-08-13 00:00:00 Asia/Tokyo" string(10) "1534086000" だと、UTCの方が値が大きい(1970/1/1からの経過秒数が多い)ので同じ時間でUTCとJSTだとUTCの方が未来(日本よりロンドンの方が日付変更が遅い)である と判定できます。