ZonedDateTimeとOffsetDateTimeの違いは何ですか?


155

ドキュメントを読みましたが、どちらを使用するべきかまだわかりません。

ドキュメントによるとOffsetDateTime、データベースに日付を書き込むときに使用する必要がありますが、理由はわかりません。


4
基本的にa ZonedDateTimeには、私が読んだものからのDST切り替えなど、タイムゾーンに関する情報も含まれています。
2015年

回答:


187

Q:Java 8 ZonedDateTimeとOffsetDateTimeの違いは何ですか?

javadocsはこれを言います:

" OffsetDateTimeZonedDateTimeおよびInstantすべてがインスタントをナノ秒の精度でタイムラインに格納します。これInstantは最も単純でインスタントを表すだけです。OffsetDateTimeローカルの日時を取得できるようにするUTC /グリニッジからのオフセットをインスタントに追加します。ZonedDateTimeフルタイムを追加します-ゾーンのルール。」

ソース:https : //docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html

従って差OffsetDateTimeとは、ZonedDateTime後者がカバー夏時間調整および様々な他の異常そのルールを含むことがあります。

簡単に言うと:

タイムゾーン =(UTCからのオフセット +異常のルール)


Q:OffsetDateTimeデータベースに日付を書き込むときにドキュメントを使用する必要があるとのことですが、理由がわかりません。

ローカルタイムオフセットのある日付は常に同じ瞬間を表すため、安定した順序になります。対照的に、完全なタイムゾーン情報を持つ日付の意味は、それぞれのタイムゾーンのルールの調整に直面して不安定です。(そして、これらは実際に起こります。たとえば、将来の日時値の場合です。)したがってZonedDateTime、実装を格納して取得する場合、実装に問題があります。

  • 計算されたオフセットを格納できます...そして、取得されたオブジェクトは、ゾーンIDの現在のルールと一致しないオフセットを持つ可能性があります。

  • 計算されたオフセットを破棄できます。取得されたオブジェクトは、保存されたものとは異なる絶対/ユニバーサルタイムラインの別のポイントを表します。

Javaオブジェクトのシリアル化を使用する場合、Java 9実装は最初のアプローチを採用します。これは間違いなくこれを処理するための「より正しい」方法ですが、これは文書化されていないようです。(JDBCドライバーとORMバインディングはおそらく同様の決定を行っており、うまくいけばうまくいきます。)

しかし、日付/時刻の値を手動で保存するアプリケーション、またはに依存するアプリケーションを作成している場合java.sql.DateTimeは、zone-idの複雑さへの対処は...おそらく避けるべきことです。したがって、アドバイス。

時間の経過とともに意味/順序が不安定になる日付は、アプリケーションにとって問題になる可能性があることに注意してください。また、ゾーンルールの変更はエッジケースであるため、予期しないときに問題が発生する可能性があります。


アドバイスの(可能性のある)2番目の理由は、aの構造がZonedDateTime特定の点で曖昧であることです。たとえば、「クロックを戻す」ときに、ローカル時間とゾーンIDを組み合わせると、2つの異なるオフセットが得られます。ZonedDateTime一貫して他の上で1つ選択されます...しかし、これは常に正しい選択ではありません。

さて、これは、ZonedDateTimeそのように値を構成するすべてのアプリケーションにとって問題になる可能性があります。しかし、誰かがエンタープライズアプリケーションを構築するという観点から見ると、(おそらく正しくない)ZonedDateTime値が永続的で後で使用される場合、より大きな問題になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.