ドキュメントを読みましたが、どちらを使用するべきかまだわかりません。
ドキュメントによるとOffsetDateTime
、データベースに日付を書き込むときに使用する必要がありますが、理由はわかりません。
ドキュメントを読みましたが、どちらを使用するべきかまだわかりません。
ドキュメントによるとOffsetDateTime
、データベースに日付を書き込むときに使用する必要がありますが、理由はわかりません。
回答:
Q:Java 8 ZonedDateTimeとOffsetDateTimeの違いは何ですか?
javadocsはこれを言います:
"
OffsetDateTime
、ZonedDateTime
および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
値が永続的で後で使用される場合、より大きな問題になります。
ZonedDateTime
には、私が読んだものからのDST切り替えなど、タイムゾーンに関する情報も含まれています。