1. 序章

私たちの世界では、各国は特定のタイムゾーンに従います。 これらのタイムゾーンは、時間を便利かつ効果的に表現するために重要です。 ただし、夏時間などの変数が原因で、タイムゾーンが不明確になる場合があります。

さらに、これらのタイムゾーンをコードで表現していると、混乱する可能性があります。 Javaは、過去に Date Time DateTime などの複数のクラスを提供して、タイムゾーンも処理してきました。

ただし、新しいJavaバージョンでは、タイムゾーンを管理するためのZoneIdZoneOffsetなどのより便利で表現力豊かなクラスが用意されています。

この記事では、 ZoneIdとZoneOffset、および関連するDateTimeクラスについて説明します。

また、Java8で導入されたDateTime クラスの新しいセットについては、以前の投稿で読むことができます。

2. ZoneIdおよびZoneOffset

JSR-310 の登場により、日付、時刻、およびタイムゾーンを管理するためのいくつかの便利なAPIが追加されました。 ZoneIdおよびZoneOffsetクラスも、この更新の一部として追加されました。

2.1.  ZoneId

上記のように、 ZoneIdは、「 Europe /Paris」などのタイムゾーンの表現です。

ZoneIdには2つの実装があります。 まず、GMT/UTCと比較してオフセットが固定されています。 次に、地理的地域として、GMT/UTCでオフセットを計算するための一連のルールがあります。

ドイツのベルリン向けにZoneIdを作成しましょう。

ZoneId zone = ZoneId.of("Europe/Berlin");

2.2.  ZoneOffset

ZoneOffsetはZoneIdを拡張し、現在のタイムゾーンの固定オフセットをGMT/ UTC (+02:00など)で定義します。

これは、この数値が固定の時間と分を表し、現在のタイムゾーンとGMT/UTCの時間の差を表すことを意味します。

LocalDateTime now = LocalDateTime.now();
ZoneId zone = ZoneId.of("Europe/Berlin");
ZoneOffset zoneOffSet = zone.getRules().getOffset(now);

国に2つの異なるオフセットがある場合、夏と冬には、同じ地域に2つの異なるZoneOffset実装があるため、LocalDateTimeを指定する必要があります。

3. DateTimeクラス

次に、ZoneIdZoneOffsetを実際に利用するいくつかのDateTimeクラスについて説明します。

3.1.  ZonedDateTime

ZonedDateTime は、 2007-12-03T10:15:30 + 01:00 Europe / Parisなど、ISO-8601カレンダーシステムのタイムゾーンを持つ日時の不変表現です。 。 ZonedDateTimeは、LocalDateTime、ZoneId、および解決されたZoneOffsetの3つの別個のオブジェクトと同等の状態を保持します。 

このクラスは、すべての日付と時刻のフィールドをナノ秒の精度で格納し、タイムゾーンを ZoneOffset で格納して、あいまいなローカル日時を処理します。 たとえば、 ZonedDateTime は、「ヨーロッパ/パリのタイムゾーンで2007年10月2日13:45.30.123456789 +02:00」という値を格納できます。

前のリージョンの現在のZonedDateTimeを取得しましょう。

ZoneId zone = ZoneId.of("Europe/Berlin");
ZonedDateTime date = ZonedDateTime.now(zone);

ZonedDateTimeは、特定の日付をあるタイムゾーンから別のタイムゾーンに変換するための組み込み関数も提供します。

ZonedDateTime destDate = sourceDate.withZoneSameInstant(destZoneId);

3.2.  OffsetDateTime

OffsetDateTime は、 2007-12-03T10:15:30 + 01:00 など、ISO-8601カレンダーシステムでオフセットされた日時の不変表現です。

このクラスは、すべての日付と時刻のフィールドをナノ秒の精度で格納し、GMT /UTCからのオフセットも格納します。 たとえば、 ResetDateTime は、値「2007年10月2日13:45.30.123456789 +02:00」を格納できます。

GMT/UTCから2時間のオフセットで現在のOffsetDateTimeを取得しましょう。

ZoneOffset zoneOffSet= ZoneOffset.of("+02:00");
OffsetDateTime date = OffsetDateTime.now(zoneOffSet);

3.3. オフセット時間

OffsetTime は、 10:15:30 + 01などのISO-8601カレンダーシステムで、多くの場合、時-分-秒-オフセットと見なされる時刻を表す不変の日時オブジェクトです。 :00

このクラスは、すべての時間フィールドをナノ秒の精度で格納し、ゾーンオフセットも格納します。 たとえば、 ResetTime は、値「13:45.30.123456789 + 02:00」を格納できます。

2時間のオフセットで現在のOffsetTimeを取得しましょう。

ZoneOffset zoneOffSet = ZoneOffset.of("+02:00");
OffsetTime time = OffsetTime.now(zoneOffSet);

4. 結論

焦点に戻ると、 ZoneOffset は、GMT/UTCと指定された時間の差に関するタイムゾーンの表現です。 これはタイムゾーンを表す便利な方法ですが、他の表現も利用できます。

さらに、ZoneIdおよびZoneOffsetは、独立して使用されるだけでなく、 ZonedDateTime OffsetDateTime[などの特定のDateTimeJavaクラスによっても使用されます。 X183X]、およびOffsetTime

いつものように、コードはGitHubリポジトリで入手できます。