こんにちは。阿部です。
夏時間。東京オリンピック関連で話題になったので、名前ぐらいは知っていると思います。
夏時間というものを甘く見てはいけません、ざっと思いつくだけでも次のような罠があります。
- 同じ国内でも実施される地域とされない地域が混在する(アリゾナ時間)
- 突然導入されたり、廃止されたりする(EUが廃止議論中?)
- 開始日、終了日が変更される(米国2007年)
- ずらす時間は1時間単位とは限らない(オーストラリア ロード・ハウ島では30分)
- 夏時間開始日には、存在しない時刻がある(後述)
- 夏時間終了日には、同じ時刻が2回存在する(後述)
今回は、この中でも特に注意が必要な、存在しない時刻と重複する時刻について解説します。
存在しない時刻
アメリカでは夏時間の始まる日は、夜中の01:59:59
の次に03:00:00
となります。
この日は2時台が存在しません。
さて、この存在しない1時間を、システムではどのように処理すべきでしょうか。
例えば、
- 毎日
01:00
~04:00
の3時間稼働する機械があったとして、夏時間への切り替え日は何時から何時まで稼働すべきか(時刻を見て動かすと2時間しか動作しない。3時間動作させようとすると終了が05:00
になってしまう) - 毎日
02:30
に起動するバッチ処理があったとして、夏時間への切り替え日は何時に起動すべきか。あるいは02:30
という時刻は存在しないので起動しなくてもよいか。
これらの問題には、一律の答えがあるわけではありません。
それぞれのシステムの要求に応じて考えていくしかありません。
Javaの場合
JavaのAPIがこの問題にどのように対処しているかを見てみましょう。
ZonedDateTime
クラスは、指定したタイムゾーンに存在しない時刻を指定した場合、1時間後の時間として解釈するようです。
例えば、ロサンゼルスでは2019-03-10T02:30:00
という時刻は存在しませんが、これは2019-03-10T03:30:00
に変換されます。
詳しくは参考URL: https://docs.oracle.com/javase/jp/8/docs/api/java/time/ZonedDateTime.html#of-java.time.LocalDateTime-java.time.ZoneId-
用途によっては、この仕様でも使えると思いますが、例えば、夏時間開始日の02:50
と03:10
という2つの時刻をZonedDateTime
に読ませると、03:50
と03:10
となり、時間の前後が逆転してしまうといった問題があります。
重複する時刻
今度は逆に夏時間が終了する日です。
夜中の01:59:59
の次に2回目の01:00:00
となり、1時台を2回繰り返します。
これも、先ほどと同じ例で考えてみます。
1. 毎日01:00
~04:00
の3時間稼働する機械があったとして、夏時間の終了日は何時から何時まで稼働すべきか(時刻を見て動かすと4時間動作してしまう。3時間動作させようとすると終了が03:00
になってしまう)
2. 毎日01:30
に起動するバッチ処理があったとして、夏時間の終了日は1回目の01:30
に起動すべきか、2回目の01:30
に起動すべきか。あるいは両方?
やはり、これにも答えはありません。システムごとに適切に対処するとしか言えません。
Javaの場合
先ほどと同様にJavaがどうなっているか見てみます。
ZonedDateTime
クラスは、指定したタイムゾーンに重複して存在する時刻を指定した場合、前に存在する時点として解釈するようです。
例えばロサンゼルスでは、2019-11-03T01:30:00
という時刻は2回訪れますが、この時刻をZonedDateTime
クラスに読ませると、
1回目の(夏時間側の)2019-11-03T01:30:00
として解釈されます。
まとめ
日本に夏時間を導入しようだなんてとんでもない!