JavaのZoneOffset
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]にあります。