前回前々回と2回にわたって時差をサポートしない日付/時刻を扱うクラスを紹介してきました。

 しかし、日時を扱う上で忘れてならないのが時差やタイムゾーンの問題です。Date and Time APIでは時差をサポートしたクラスとしてOffsetTimeクラス、OffsetDateTimeクラスが提供されています。また、タイムゾーンをサポートしたZonedDateTimeクラスも提供されています。

 これらのクラスを紹介する前に、Date and Time APIでの時差およびタイムゾーンについてまず紹介しましょう。

時差とタイムゾーン

 第23回 Date and Time APIとISO 8601で紹介しましたが、ISO 8601ではUTCからの時差(Offset)のみを扱います。しかし、Javaでは夏時間のサポートを含めたタイムゾーンをサポートしています。

 第23回で紹介したように、タイムゾーンは地域名(ZoneId)とUTCからの時差(Offset)から構成されます。

 Date and Time APIでは、タイムゾーンを扱うクラスとしてjava.time.ZoneIdクラスを使用します。また、時差だけを扱うクラスとしてjava.time.ZoneOffsetクラスが提供されています。ZoneOffsetクラスはZoneIdクラスのサブクラスになっています。

 では、次節からZoneIdクラスとZoneOffsetクラスについて見ていきましょう。

ZoneId

 ZoneIdクラスはタイムゾーンを表すクラスで、クラス名から分かるように地域名を扱えます。ZoneIdクラスは抽象クラスで、時差を扱う場合はサブクラスのZoneOffsetクラスを使用します。また、地域名からオブジェクトを生成する場合、ZoneRegionクラスが使用されます。しかし、ZoneRegionクラスはデフォルトアクセスのため、APIドキュメントには記載されていません。

 ZoneIdクラスは地域名、時差を保持し、またタイムゾーンから時差がどのように変化するルールも保持しています。ZoneIdオブジェクトでは、4種類のファクトリメソッドが提供されています。

  • systemDefault
  • of
  • ofOffset
  • from

 systemDefaultメソッドを使用するとデフォルトのタイムゾーンのZoneIdオブジェクトを取得できます。

リスト1 systemDefaultメソッドの使用例

// デフォルトのタイムゾーン     
ZoneId id = ZoneId.systemDefault();