前回前々回と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();

この先は会員の登録が必要です。今なら有料会員(月額プラン)が12月末まで無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら