はじめに
日本にもかつてサマータイムがあったという事を皆さんはご存じですか?
私はこの問題に直面するまで知りませんでした。。
実は過去に日本でもサマータイムが導入された時期があり、サマータイム開始日の0時~1時をPHPのCarbonライブラリで扱う場合は注意が必要です。
発生したトラブル
ある日、担当しているプロジェクトで「特定の日付で絞込検索しても対象のデータがヒットしない」と言われ調べてみたところ、なぜか発行されたSQLの日時が期待値とズレていました。
'1948-05-02 00:00:00'
を期待していたところ、 '1948-05-02 01:00:00'
と、1時間ずれていたために0時のデータが取得できない状態になっていました。
タイムゾーンの設定も問題なく、色々調べたところ、受け取った日付パラメータをCarbonに渡してインスタンス生成したタイミングで時間がずれている事がわかりました。
何故そんな事が起こっているのかまったく分からず、すがる思いでその日付をそのままGoogle先生にお聞きしたところ「サマータイム」の文字が・・・。
日本のサマータイムとCarbon
過去、日本でもサマータイムが採用されていたタイミングが4年間だけ存在し、以下の日付の0時になる瞬間に1時間調整される制度があったようです。
- 1948-05-02 00:00:00 -> 1948-05-02 01:00:00
- 1949-04-03 00:00:00 -> 1949-04-03 01:00:00
- 1950-05-07 00:00:00 -> 1950-05-07 01:00:00
- 1951-05-06 00:00:00 -> 1951-05-06 01:00:00
そのため、「1948-05-02 00:00:00 ~ 1948-05-02 00:59:59 」は存在しない時間となり、Carbonでは強制的に「+1h」されるようです。
試してみた
サマータイム開始日の日付だけを渡すと「01:00:00」になる。
$date = new Carbon('1948-5-2');
echo $date;
---
=> 1948-05-02 01:00:00
時間「00:00:00」を指定しても「01:00:00」になる
$date = new Carbon('1948-5-2 00:00:00');
echo $date;
---
=> 1948-05-02 01:00:00
時間「00:59:59」を渡しても +1h される
$date = new Carbon('1948-5-2 00:59:59');
echo $date;
---
=> 1948-05-02 01:59:59
最後に
これまでサマータイムを意識した開発をしたことが無かったため、今回かなりハマってしまいました。
皆様もお気をつけ下さいませ。