システム開発における夏時間(サマータイム)の取り扱いについて

posted in: etc | 0

こんにちは。阿部です。

夏時間。東京オリンピック関連で話題になったので、名前ぐらいは知っていると思います。
夏時間というものを甘く見てはいけません、ざっと思いつくだけでも次のような罠があります。

  • 同じ国内でも実施される地域とされない地域が混在する(アリゾナ時間)
  • 突然導入されたり、廃止されたりする(EUが廃止議論中?)
  • 開始日、終了日が変更される(米国2007年)
  • ずらす時間は1時間単位とは限らない(オーストラリア ロード・ハウ島では30分)
  • 夏時間開始日には、存在しない時刻がある(後述)
  • 夏時間終了日には、同じ時刻が2回存在する(後述)

今回は、この中でも特に注意が必要な、存在しない時刻と重複する時刻について解説します。

存在しない時刻

アメリカでは夏時間の始まる日は、夜中の01:59:59の次に03:00:00となります。
この日は2時台が存在しません。
さて、この存在しない1時間を、システムではどのように処理すべきでしょうか。
例えば、

  1. 毎日01:0004:00の3時間稼働する機械があったとして、夏時間への切り替え日は何時から何時まで稼働すべきか(時刻を見て動かすと2時間しか動作しない。3時間動作させようとすると終了が05:00になってしまう)
  2. 毎日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:5003:10という2つの時刻をZonedDateTimeに読ませると、03:5003:10となり、時間の前後が逆転してしまうといった問題があります。

重複する時刻

今度は逆に夏時間が終了する日です。
夜中の01:59:59の次に2回目の01:00:00となり、1時台を2回繰り返します。
これも、先ほどと同じ例で考えてみます。
1. 毎日01:0004: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として解釈されます。

まとめ

日本に夏時間を導入しようだなんてとんでもない!

LINEで送る
Pocket