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