1.はじめに

私たちの世界では、各国は特定の時間帯に従います。これらの時間帯は時間を便利にそして効果的に表現するために重要です。ただし、夏時間などの変数が原因でタイムゾーンが暗黙的に表示されることがあります。

さらに、これらのタイムゾーンをコード内で表現していると、混乱を招く可能性があります。 Javaは、タイムゾーンを処理するために、これまで

Date



Time



DateTime

などの複数のクラスを提供してきました。

ただし、新しいJavaバージョンでは、タイムゾーンを管理するための

ZoneId



ZoneOffset

など、より便利で表現力豊かなクラスが登場しました。

この記事では、

ZoneId



ZoneOffset

、および関連する

__DateTime

__class ** について説明します。

また、Java 8で導入された新しい一連の

DateTime

クラスについては、https://www.baeldung.com/java-8-date-time-intro[以前の投稿]で読むことができます。

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 ** を使用して現在のタイムゾーンの固定オフセットを定義します。

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

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

  • 国によって2つの異なるオフセットがある場合 – 夏と冬では、同じ地域に対して2つの異なる


    _ZoneOffset


    implementationsがあるため、

    LocalDateTime_

    ** を指定する必要があります。

3.

DateTime

クラス

次に、実際に

ZoneId



ZoneOffset

を利用する

DateTime

クラスについて説明しましょう。

3.1. __ZonedDateTime

__


ZonedDateTime

は、ISO-8601カレンダーシステムのタイムゾーン付きの日時の不変表現です(例:

__2007-12-03T10:15:30 01:00 Europe/Pari


s)。



ZonedDateTime

は、3つの別々のオブジェクト、

LocalDateTime



ZoneId

、および解決された

ZoneOffset__に相当する状態を保持します。

このクラスは、すべての日付および時刻フィールドをナノ秒の精度で格納し、

ZoneOffset

を使用してあいまいなローカルの日付時刻を処理するタイムゾーンを格納します。たとえば、

ZonedDateTime

には、「2007年10月2日13時45分30秒23456789 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 ** からのオフセットと同様に、すべての日付と時刻フィールドをナノ秒の精度で格納します。たとえば、

    OffsetDateTime

    には、値「2007年10月2日13時45分30秒23456789 02:00」を格納できます。

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

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

3.3.

OffsetTime


OffsetTime

は、ISO-8601カレンダーシステムでは、時分秒のオフセットとして表示されることが多い、時間を表す不変の日時オブジェクトです(

10:15:30 01:00

など)。

  • このクラスは、ゾーンオフセット** と同様に、すべての時間フィールドをナノ秒の精度で格納します。たとえば、

    OffsetTime

    には、「13:45.30.123456789 + 02:00」という値を格納できます。

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

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

4.まとめ

焦点に戻ると、

ZoneOffset

は、GMT/UTCと指定された時間との差という観点からのタイムゾーンの表現です。

他にも利用可能な表現がありますが、これはタイムゾーンを表現する便利な方法です。

さらに、

ZoneId

および

ZoneOffset

は、独立して使用されるだけでなく、

ZonedDateTime



OffsetDateTime

、および

OffsetTime

などの特定の

DateTime

Javaクラスによっても使用されます。

いつものように、コードは私たちのhttps://github.com/eugenp/tutorials/tree/master/core-java[GitHub repository]にあります。