2012-07-26 45 views
2

我們有一個MySQL數據庫,其中UTC時間戳被保存到DATETIME列中。休眠和MySQL:UTC datetime

我通過Hibernate檢索這些時間(進入Date屬性,帶有TemporalType.TIMESTAMP),並希望不改變地將它們顯示給用戶。

我看到的問題是,當Hibernate讀取列值時,它會爲對象的Date屬性指定一個時區(從紀元開始的秒數)值。但是,它按照本地時區存儲此值。

mysql> create table datetest(mydate datetime); 
Query OK, 0 rows affected (0.13 sec) 

mysql> insert into datetest values('2012-07-25 16:00:00'); 
Query OK, 1 row affected (0.00 sec) 

mysql> select mydate from datetest; 
+---------------------+ 
| mydate    | 
+---------------------+ 
| 2012-07-25 16:00:00 | 
+---------------------+ 
1 row in set (0.00 sec) 

載入內休眠的 「datetest」 對象和查看 「指明MyDate」 值表示的值作爲:

2012-05-24T15:00:00.000+0100 

我在英國,所以0100(GMT + DST)是當地時區。這符合UNIX_TIMESTAMP()結果:

mysql> select unix_timestamp(mydate) from datetest; 
+------------------------+ 
| unix_timestamp(mydate) | 
+------------------------+ 
|    1343228400 | 
+------------------------+ 
1 row in set (0.00 sec) 

我猜想當Hibernate加載它使用UNIX_TIMESTAMP記錄()來填充對象的日期屬性。爲UNIX_TIMESTAMP()文檔指出:

服務器解釋日期爲當前時區的值和 其轉換爲內部值UTC

我沒有控制改變服務器的全球時區,並且我們的數據庫中還有許多其他與時區相關的列,這些列不應該改變。那麼我怎樣才能告訴Hibernate只有某些列值是UTC,並確保它不會對它們應用任何時區「格式化」?

在MySQL命令行客戶端,我可以改變使用

SET TIME_ZONE='+0:00' 

當地時區,這允許UNIX_TIMESTAMP()返回一個UTC值,但我不知道如何告訴Hibernate之前發送該值運行從數據庫中提取信息的標準/投影。

回答

0

Java Timestamp沒有任何時區。您看到的時區是您當地的時區,通過將Timestamp實例轉換爲可讀的字符串(並且您未在問題中告訴我們)的方法顯示該時區。爲了您的方便,此方法似乎使用您的本地時區,以便您可以輕鬆地將它顯示的時間與掛鐘顯示的時間進行比較。

如果要以其他方式格式化Timestamp實例,請使用其他時區,請使用SimpleDateFormat

+0

我明白了,所以時區並不真正相關,除了當我正在調試時,toString()或類似的東西加回來時?我想關鍵是確保生成的時間戳是基於UTC的,而不是由MySQL本地轉換。我試圖在Hibernate查詢之前直接發送SET TIME_ZONE ='+ 0:00'SQL查詢,但這似乎沒有什麼區別。 – jdp80 2012-07-27 09:14:47

+0

是的。我不知道您使用哪種方法顯示時間戳,但它不包含任何時區。 – 2012-07-27 09:17:04