sql >> データベース >  >> RDS >> Mysql

JPATemporalType.Dateが間違った日付を与えている

    申し訳ありませんが、これまでの回答はすべて一般的に正しくありません。回答は非常に単純ですが、5つのポイントを分ける必要があります。

    1. DATE =java.sql.Date。これは、UTCタイムゾーンのエポックからのミリ秒数であるjava.util.Dateのラッパーです。したがって、これには、固定のGMT + 0(UTC)タイムゾーンでの年/月/日付/時間/分/秒が含まれます。ただし、java.sql.Dateは時間コンポーネントをゼロに設定することに注意してください!
    2. TIMESTAMP =java.sql.TimeStampは、SQLDATE型標準をサポートするために秒の小数部を追加するDateのコンポーネントラッパーです。このクラス/タイプは、この質問には関係がないか、必要ありませんが、要するに、これには日付と時刻が含まれます。
    3. データベースは、定義されたとおりにDATEオブジェクトを格納します(JavaからのオフセットとしてUTCを使用)が、可能性があります データベースで別のタイムゾーンに設定されている場合は、時間を変換します。デフォルトでは、ほとんどのデータベースはデフォルトでローカルサーバーのタイムゾーンに設定されていますが、これは非常に悪い考えです。紳士淑女...常にDATEオブジェクトをUTCで保存します。続きを読む...
    4. JVMとタイムゾーンの時刻は正しい必要があります。 DateオブジェクトはUTCを使用しているので、サーバー時間に対してオフセットが計算されますか?サーバー時間をGMT+0(UTC)に設定することを強くお勧めします。
    5. 最後に、データベースからDATEをレンダリングする場合(JSFなどを使用)、 GMT + 0タイムゾーンになるように設定し、サーバーから実行する場合も...日付と時刻は常に一貫性があり、参照可能であり、すべてが良いものになります。残っているのは時間をレンダリングすることだけです。これは、ユーザーエージェント(たとえば、Webアプリケーションの場合)ができる場所です。 GMT+0時間をユーザーの「ローカル」タイムゾーンに変換するために使用されます。

    概要:サーバー、データベース、JavaオブジェクトでUTC(GMT + 0)を使用します。

    DATEとTIMESTAMPは、TIMESTAMPが追加の秒数を運ぶという点で、データベースの観点からのみ異なります。どちらもGMT+0(暗黙)を使用します。 JodaTimeは、これらすべてに対処するための推奨カレンダーフレームワークですが、JVMとデータベースのタイムゾーン設定の不一致の問題を修正することはできません。

    JVMからDBへのアプリケーション設計でGMTを使用しない場合、夏時間、時計の調整、および世界のローカルクロックで実行されるその他のあらゆる種類の地域ゲームのために、トランザクションの時間やその他すべてが永遠に歪められます。 、非参照、一貫性のないなど。

    データ型に関するもう1つの適切な関連回答: java.util .Dateとjava.sql.Date

    また、Java 8には(最終的に)より良い日付/時刻処理の更新がありますが、これは、JVMが実行されているサーバークロックをあるタイムゾーンに置き、データベースを別のタイムゾーンに置くことを修正しません。この時点で、常に翻訳が行われています。私が使用しているすべての大規模な(スマート)クライアントでは、データベースとJVMサーバーのタイムゾーンは、その操作が他のタイムゾーンで主に発生している場合でも、まさにこの理由でUTCに設定されています。



    1. データ型xmltypeの列でora_hashを使用する方法

    2. 計算列がSQLServerで「永続化」されているかどうかを確認する方法

    3. pythonmysqldbを使用して一度に多くの行を挿入する方法

    4. MariaDBで重複する行を削除する2つの方法(主キーを無視します)