4

問題:アプリサーバーで正しいタイミング、データベースで間違っている。

私は中国にいます。タイムゾーンはUTC+8です。休止状態を使用しています。次のようなエンティティ定義(言語:Scala)

class CargoJournal {
    @Type(`type`="org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime")
    var deliverTime: LocalDateTime = _

    @Temporal(TemporalType.TIMESTAMP)
    @Column(nullable=false)
    var logDate:Date = _
}

Hibernateログを開きます。アプリサーバーで以下を参照してください。現在の時刻は、2012年9月13日木曜日11:08:44 CST

insert into wms_history_cargo_journal (deliver_time, log_date)
binding parameter [1] as [TIMESTAMP] - 2012-09-13 11:08:44.25
binding parameter [2] as [TIMESTAMP] - Thu Sep 13 11:08:44 CST 2012

私のデータベースサーバーでは:

mysql> select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));
+----------------------------------------------------------------+
| timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')) |
+----------------------------------------------------------------+
| 08:00:00                                                       |
+----------------------------------------------------------------+

したがって、mysqlのタイムゾーンは正しいです。UTC + 8

mysqlから選択した後:

mysql> SELECT deliver_time, log_date FROM wms_history_cargo_journal;
+---------------------+---------------------+
| deliver_time        | log_date            |
+---------------------+---------------------+
| 2012-09-13 11:08:44 | 2012-09-13 03:08:44 |
+---------------------+---------------------+

log_dateが間違っています!

4

1 に答える 1

1

MySQLの列の種類は何ですか?DATETIMEだと思います。このタイプは「時間の瞬間」を保存せず、「時計の時間」を保存するため、異なるタイムゾーンで異なる瞬間を意味する可能性があります。

MySQLドライバーがjava.util.DateをDATETIME列に書き込む場合、同じjava.util.Dateが異なるタイムゾーンで異なる時間を意味する可能性があるため、「houronclock」を書き込むためにいくつかのタイムゾーンを選択する必要があります。MySQLサーバーのローカルタイムゾーンと同様に時間を保存します。

LocalDateTimeは、DATETIMEに似ているため、この問題は発生しません。これは、瞬間ではなく、時計の時間を表します。したがって、年/月/日-時/分/秒はデータベースに保存されるだけです。HibernateログでLocalDateTimeがそのまま表示され、Dateの横にタイムゾーン(「CST」)があることに注意してください。

通常、時刻は常にUTCで保存することをお勧めします。したがって、DateやLocalDateTimeではなく、DateTimeを使用してください。jadiraコンバーターを使用したDateTimeは、常にDATETIMEをUTCとして格納/読み取ります。

于 2012-10-02T16:04:14.380 に答える