2012-09-13 37 views
4

問題:在應用程序服務器的正確時間,數據庫中的錯誤。日期時間正確的應用程序,但錯誤的MySQL [時區]

我在中國,時區爲UTC + 8 我使用hibernate。實體定義如下(語言:斯卡拉)

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

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

我打開休眠日誌,在我的應用服務器中查看以下內容。當前時間是週四09月13日11時08分44秒CST 2012

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是錯誤的!

+0

爲什麼你的'logDate'字段沒有註解'@Type(type =「org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime」)'?由於'LocalDateTime'數據類型和相應的註釋,我假設'deliverTime'按預期工作,但是你的'logDate'不起作用,因爲它沒有類似的映射? –

回答

1

什麼是MySQL的列類型?我懷疑這是DATETIME。這種類型不存儲「時刻」,它存儲「時鐘上的小時」,因此可以表示不同時區的不同時刻。

當MySQL驅動程序寫入java.util.Date到DATETIME列時,它必須選擇一些時區來寫「小時制」,因爲相同的java.util.Date可能意味着不同時區的不同時區。它像MySQL服務器本地時區一樣存儲小時。

LocalDateTime沒有這個問題,因爲它就像DATETIME一樣。它代表時鐘上的小時,而不是時間,因此年/月/日/小時/分/秒僅存儲在數據庫中。注意休眠日誌LocalDateTime是按原樣給出的,而Date的旁邊有時區(「CST」)。

通常,將時間始終保存爲UTC是個好習慣,因此請使用DateTime,而不是Date或LocalDateTime。使用jadira轉換器的DateTime始終以UTC格式存儲/讀取DATETIME。

相關問題