6

こんにちは、
私は世界中で使用される Web アプリケーション サービスを作成しています。
したがって、日時の値を UTC で保存し、それらをエンド ユーザーへの壁時間の時計で表す必要があります。
スタックオーバーフローを読んだ後、次のことを行う必要があることを理解しました。

  1. DB の列タイプとしてタイムスタンプを使用します (現在の MariaDB 10.1.20)
  2. 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

質問:

  1. 私は私の選択で正しいですか?おそらく、別の列またはJavaタイプを使用する必要があります...
  2. 変換を行うのは正しいですか。他にもっと良い方法があるかもしれません

ありがとうございました

  1. 編集:マット・ジョンソンの助けの後、私は問題が実際にあることを理解しました.datetimeをDBに保存すると、分数は保存されませんが、そうすべきです. 参考までに列の型はtimestamp(6)です。
  2. 編集:ZonedDateTimeの代わりにjava.time.Instantを使用するようになりました
4

2 に答える 2