ただし、Hibernateが実際にデータベースに保持される場合、日付は現地時間に変換されて保存されます)。値はエンティティセッターで「2009-09-0900:08:08」として設定されています-GMTデータベースに保持される実際の値は「2009-09-0808:08:08」-米国東部時間です。
まず、MySQLに日付を保存するために使用している列タイプ(TIMESTAMPまたはDATETIME)に関係なく、どちらもタイムゾーンを保存しません。Reから:日時を使用したタイムゾーンの保存:
そして第二に、バグのある動作でない限り、変換はサーバーまたはサーバーのタイムゾーン設定に応じてJDBCドライバーのいずれかによって行われるため、一貫性のないデータが取得されないことを理解しています。
どちらの場合も、私のポイントは、「2009-09-0900:08:08」-GMTまたは「2009-09-0808:08: 08」を保存することです。データベース。
ただし、表示時に別の変換が行われているように見えます。これは疑問を投げかけます:「永続化された日付」の値を実際にどのようにチェックしたのですか。「問題」はSQLクライアントで発生しますか?Javaコードでは?
参考文献
DateTimeのMySQLドキュメントには、「MySQLはDATETIME値を「YYYY-MM-DDHH:MM:SS」形式で取得して表示する」と記載されています。つまり、mysqlは「エポックからのミリ秒」を上記の形式に変換します。だから今私の質問は、タイムゾーン情報もmysqlに保存されていますか?
私は最初の答えを更新しました(これは完全に正確/網羅的ではありませんでした)。DATETIMEまたはTIMESTAMPのどちらを使用していても、答えはノーです。
私が行ったもう1つの観察結果は、上記の日付の「変換」の問題は、ImがJavaアプリケーションで日付を設定している場合にのみ存在するということです。'UTC_TIMESTAMP()'を使用して日付を更新/設定するmysqlトリガーを作成すると、日付は'UTC'時間で表示されます。
UTC_TIMESTAMP ()関数は、常に現在のUTC日付と時刻を返します。
私が知りたいのは:
- どのようにして問題を「明らかに」しましたか?SQLクライアントまたはJavaから?
- JVMのローカルタイムゾーンは何ですか?
- MySQLサーバーのタイムゾーンとは何ですか?
- MySQL JDBCドライバーのバージョンは何ですか?
- 生のJDBCを使用してテストを実行できますか?