JavaのZoneOffset
1. 前書き
私たちの世界では、各国は特定のタイムゾーンに従います。 これらのタイムゾーンは、時間を便利かつ効果的に表現するために重要です。 ただし、夏時間などの変数が影響してくるため、タイムゾーンが不明確になる場合があります。
さらに、これらのタイムゾーンをコードで表現していると、混乱する可能性があります。 Javaは、過去にDate、Time、DateTimeなどの複数のクラスを提供して、タイムゾーンも処理してきました。
ただし、新しいJavaバージョンでは、タイムゾーンを管理するためのZoneIdやZoneOffsetなどのより便利で表現力豊かなクラスが用意されています。
この記事では、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クラス
次に、実際にZoneIdとZoneOffsetを利用するいくつかのDateTimeクラスについて説明します。
3.1. ZonedDateTime
ZonedDateTimeは、2007-12-03T10:15:30+01:00 Europe/ParisなどのISO-8601カレンダーシステムのタイムゾーンを持つ日時の不変表現です。 A 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と指定された時間の差に関するタイムゾーンの表現です。 これは時間帯を表す便利な方法ですが、他の表現も利用できます。
さらに、ZoneIdとZoneOffsetは、独立して使用されるだけでなく、ZonedDateTime、OffsetDateTime、OffsetTimeなどの特定のDateTimeJavaクラスによっても使用されます。
いつものように、コードはGitHub repositoryで利用できます。