1. 概要

ZonedDateTimeOffsetDateTimeは、 Java 8 DateTime API で非常に人気のあるクラスです。さらに、は両方ともタイムラインにインスタントを保存しますナノ秒の精度まで。そして、最初は、それらの間で選択するのが混乱するかもしれません。

このクイックチュートリアルでは、ZonedDateTimeOffsetDateTimeの違いを見ていきます。

2. ZonedDateTime

A ZonedDateTime は、 2007-12-03T10:15:30 + 01:00 Europe /Paris[などのISO-8601カレンダーシステムのタイムゾーンを持つ日時の不変表現です。 X169X]s。 LocalDateTime、ZoneId、および解決されたZoneOffsetの3つの別個のオブジェクトと同等の状態を保持します。 

ここで、 ZoneId は、オフセットがいつどのように変更されるかを決定します。 したがって、ゾーンが有効なオフセットを制御するため、オフセットを自由に設定することはできません。

特定の地域の現在のZonedDateTimeを取得するには、次を使用します。

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

ZonedDateTime クラスは、特定の日付をあるタイムゾーンから別のタイムゾーンに変換するための組み込みメソッドも提供します。

ZonedDateTime destZonedDateTime = sourceZonedDateTime.withZoneSameInstant(destZoneId);

最後に、完全にDSTに対応しており、夏時間の調整を処理します。特定のタイムゾーンで日時フィールドを表示する場合に便利です。

3. OffsetDateTime

An OffsetDateTime は、 2007-12-03T10:15:30 + 01:00などのISO-8601カレンダーシステムのUTC/グリニッジからのオフセットを使用した日時の不変表現です。 。 つまり、は、 すべての日付と時刻のフィールドをナノ秒の精度で格納し、GMT /UTCからのオフセットも格納します。

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

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

4. 主な違い

まず、2つの日付を完全なタイムゾーン情報と直接比較することは(変換なしで)意味がありません。 したがって、ローカル時間オフセットのある日付は常に同じ時刻を表すため、ZonedDateTimeよりもOffsetDateTimeをデータベースに保存することを常に優先する必要があります。

さらに、 ZonedDateTime とは異なり、 OffsetDateTime を格納する列にインデックスを追加しても、日付の意味は変わりません。

主な違いを簡単にまとめましょう。

ZonedDateTime

  • すべての日付と時刻のフィールドをナノ秒の精度で格納し、タイムゾーンを格納します。ゾーンオフセットは、あいまいなローカル日時の処理に使用されます。
  • ゾーンが有効なオフセット値を制御するため、オフセットを自由に設定することはできません
  • 完全にDSTに対応しており、夏時間の調整を処理します
  • ユーザー固有のタイムゾーンで日時フィールドを表示するのに便利です

OffsetDateTime:

  • すべての日付と時刻のフィールドをナノ秒の精度で格納し、GMT / UTCからのオフセットも格納します(タイムゾーン情報なし)
  • データベースに日付を保存したり、ネットワークを介して日付を通信したりするために使用する必要があります

5. 結論

このチュートリアルでは、ZonedDateTimeOffsetDateTimeの違いについて説明しました。

いつものように、完全なソースコードはGithubから入手できます。