JavaのZoneOffset
1. 序章
私たちの世界では、各国は特定のタイムゾーンに従います。 これらのタイムゾーンは、時間を便利かつ効果的に表現するために重要です。 ただし、夏時間などの変数が原因で、タイムゾーンが不明確になる場合があります。
さらに、これらのタイムゾーンをコードで表現していると、混乱する可能性があります。 Javaは、過去に Date 、 Time 、 DateTime などの複数のクラスを提供して、タイムゾーンも処理してきました。
ただし、新しいJavaバージョンでは、タイムゾーンを管理するためのZoneIdやZoneOffsetなどのより便利で表現力豊かなクラスが用意されています。
この記事では、 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クラス
次に、ZoneIdとZoneOffsetを実際に利用するいくつかのDateTimeクラスについて説明します。
3.1. ZonedDateTime
ZonedDateTime は、 2007-12-03T10:15:30 + 01:00 Europe / Parisなど、ISO-8601カレンダーシステムのタイムゾーンを持つ日時の不変表現です。 。
このクラスは、すべての日付と時刻のフィールドをナノ秒の精度で格納し、タイムゾーンを ZoneOffset で格納して、あいまいなローカル日時を処理します。 たとえば、 ZonedDateTime は、「ヨーロッパ/パリのタイムゾーンで2007年10月2日13:45.30.123456789 +02:00」という値を格納できます。
前のリージョンの現在のZonedDateTimeを取得しましょう。
ZoneId zone = ZoneId.of("Europe/Berlin");
ZonedDateTime date = ZonedDateTime.now(zone);
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 、
いつものように、コードはGitHubリポジトリで入手できます。