JavaのZoneOffset

JavaのZoneOffset

1. 前書き

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

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

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

この記事では、we’ll discuss ZoneId and ZoneOffset as well as related DateTime classes

また、Java 8で導入されたDateTimeクラスの新しいセットについては、previous postで読むことができます。

2. ZoneIdおよびZoneOffset

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

2.1. ZoneId

上記のように、 ‘Europe/Paris‘などのZoneId is a representation of the time-zone

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

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

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

2.2. ZoneOffset

ZoneOffset extends ZoneId anddefinesthe fixed offset of the current time-zone with GMT/UTC(+02:00など)。

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

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

In case a country has 2 different offsets – in summer and winter, there will be 2 different ZoneOffset implementations for the same region, hence the need to specify a LocalDateTime

3. DateTimeクラス

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

3.1. ZonedDateTime

ZonedDateTimeは、2007-12-03T10:15:30+01:00 Europe/ParisなどのISO-8601カレンダーシステムのタイムゾーンを持つ日時の不変表現です。 ZonedDateTime holds state equivalent to three separate objects, a LocalDateTime, a ZoneId and the resolved ZoneOffset

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

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

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

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

ZonedDateTime destDate = sourceDate.withZoneSameInstant(destZoneId);

3.2. OffsetDateTime

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

This class stores all date and time fields, to a precision of nanoseconds, as well as the offset from GMT/UTC。 たとえば、OffsetDateTimeは、「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

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

This class stores all time fields, to a precision of nanoseconds, as well as a zone offset。 たとえば、OffsetTimeは値「13:45.30.123456789 + 02:00」を格納できます。

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

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

4. 結論

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

さらに、ZoneIdZoneOffsetは、独立して使用されるだけでなく、ZonedDateTimeOffsetDateTimeOffsetTimeなどの特定のDateTimeJavaクラスによっても使用されます。

いつものように、コードはGitHub repositoryで利用できます。