web-dev-qa-db-ja.com

JavaでのMySQLの日時とタイムスタンプの処理

Javaアプリケーションでは、日付時刻とタイムスタンプの組み合わせを使用してMySQLデータベースで日付情報を抽出および入力するという点で、どのような妥協点がありますか?

57
James P.

MySQL ドキュメント には、MySQLタイプのJavaタイプへのマッピングに関する情報があります。一般に、MySQL日時およびタイムスタンプの場合、Java.sql.Timestamp。いくつかのリソースが含まれます:

http://dev.mysql.com/doc/refman/5.1/en/datetime.html

http://www.coderanch.com/t/304851/JDBC/Java/Java-date-MySQL-date-conversion

保存方法Java Date to Mysql datetime ...?

http://www.velocityreviews.com/forums/t599436-the-best-practice-to-deal-with-datetime-in-mysql-using-jdbc.html

編集:

他の人が示したように、文字列の使用の提案は問題につながる可能性があります。

8
Garett

BalusCは問題についての良い説明をしましたが、ユーザーが自分で選択してテストできる良いエンドツーエンドのコードが欠けています。

ベストプラクティスは、常に日時をDBのUTCタイムゾーンに格納することです。 SQLタイムスタンプタイプにはタイムゾーン情報がありません。

日時値をSQL DBに書き込むとき

    //Convert the time into UTC and build Timestamp object.
    Timestamp ts = Timestamp.valueOf(LocalDateTime.now(ZoneId.of("UTC")));
    //use setTimestamp on preparedstatement
    preparedStatement.setTimestamp(1, ts);

DBからJavaに値を読み戻す場合、

  1. Java.sql.Timestamp型でそのまま読んでください。
  2. LocalDateTimeクラスのatZoneメソッドを使用して、DateTime値をUTCタイムゾーンの時刻として装飾します。
  3. 次に、目的のタイムゾーンに変更します。ここでは、トロントのタイムゾーンに変更しています。

    ResultSet resultSet = preparedStatement.executeQuery();
    resultSet.next();
    Timestamp timestamp = resultSet.getTimestamp(1);
    ZonedDateTime timeInUTC = timestamp.toLocalDateTime().atZone(ZoneId.of("UTC"));
    LocalDateTime timeInToronto = LocalDateTime.ofInstant(timeInUTC.toInstant(), ZoneId.of("America/Toronto"));
    
4
Dorjee