こんにちは、
私は世界中で使用される Web アプリケーション サービスを作成しています。
したがって、日時の値を UTC で保存し、それらをエンド ユーザーへの壁時間の時計で表す必要があります。
スタックオーバーフローを読んだ後、次のことを行う必要があることを理解しました。
- DB の列タイプとしてタイムスタンプを使用します (現在の MariaDB 10.1.20)
- Java で ZonedDateTime を使用します (私は java8 を使用します)
これらの値を変換しているときに問題が発生しました。
JDBC を使用しているため、次の変換を行う必要があります。
java.sql.Timestamp <-> java.time.ZonedDateTime
私のコード:
// Get current zonedDateTime
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneOffset.UTC);
// Convert zonedDateTime to java.sql.Timestamp before saving to DB
Timestamp = Timestamp.from(zonedDateTime.toInstant());
// Get zonedDateTime from resultSet
Timestamp timestamp = (Timestamp) resultSet.getObject("created");
ZonedDateTime zonedDateTime =
ZonedDateTime.ofInstant(ts.toInstant(), ZoneOffset.UTC))
私が使用する場合:
zonedDateTimeBeforeSave.isEqual(zonedDateTimeAfterSave);
false が返されます (ドメイン モデルのオーバーライドされた equal メソッドでそれらを比較する必要があります)
以下は両方の出力です。
zonedDateTimeBeforeSave: 2017-01-24T20:18:17.720Z
zonedDateTimeAfterSave: 2017-01-24T20:18:17Z
質問:
- 私は私の選択で正しいですか?おそらく、別の列またはJavaタイプを使用する必要があります...
- 変換を行うのは正しいですか。他にもっと良い方法があるかもしれません
ありがとうございました
- 編集:マット・ジョンソンの助けの後、私は問題が実際にあることを理解しました.datetimeをDBに保存すると、分数は保存されませんが、そうすべきです. 参考までに列の型はtimestamp(6)です。
- 編集:ZonedDateTimeの代わりにjava.time.Instantを使用するようになりました