1. ホーム
  2. java

[解決済み] ZonedDateTimeとOffsetDateTimeの違いは何ですか?

2022-04-21 12:21:34

質問

ドキュメントを読みましたが、どのような場合にどちらを使うべきか、まだ理解できていません。

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

どうすればいいですか?

<ブロッククオート

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

javadocsにはこのように書かれています。

"です。 OffsetDateTime , ZonedDateTimeInstant はすべてナノ秒の精度で時間軸上のある瞬間を保存します。 Instant は最も単純で、単にその瞬間を表します。 OffsetDateTime は、UTC/Greenwich からのオフセットをインスタンスに追加し、ローカルの日付時刻を取得できるようにします。 ZonedDateTime は、完全なタイムゾーンのルールを追加します。

出典 https://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html

このように OffsetDateTimeZonedDateTime というのは、後者にはサマータイム調整やその他さまざまな異常事態をカバーするルールが含まれているからです。

簡単に言うと

時間帯 = ( オフセット・フロムUTC + ルール-フォー-アノマリー )


<ブロッククオート

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

ローカルタイムのオフセットがある日付は、常に同じ時刻を表し、したがって安定した順序を持ちます。 これに対して、タイムゾーンの情報をすべて含む日付は、それぞれのタイムゾーンのルールが調整されると、その意味が不安定になります。 (例えば、将来の日付時刻の値などです。 ZonedDateTime は実装に問題があります。

  • 計算されたオフセットを保存することができる......そして、取得したオブジェクトは、ゾーンIDの現在のルールと矛盾したオフセットを持つかもしれない。

  • 計算されたオフセットを破棄することができます ... そして、検索されたオブジェクトは、保存されたものとは異なる絶対/普遍タイムライン上のポイントを表します。

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

しかし、手動で日付/時刻の値を保存するアプリケーションを作成している場合、あるいは java.sql.DateTime となると、Zone-idの複雑な処理は...おそらく避けるべきものでしょう。 というわけで、アドバイスです。

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


アドバイスの(可能性のある)第二の理由は、構成が ZonedDateTime が曖昧な点があります。 たとえば、「時計を戻す」期間では、ローカルタイムとゾーンIDを組み合わせると、2つの異なるオフセットが得られます。 そのため ZonedDateTime は一貫してどちらかを選びますが、これが常に正しい選択とは限りません。

さて、これは ZonedDateTime の値はこのようになります。 しかし、エンタープライズアプリケーションを構築する人の観点からは、(不正確である可能性のある)値が ZonedDateTime の値は永続的に使用されます。