我們有一個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之前發送該值運行從數據庫中提取信息的標準/投影。
我明白了,所以時區並不真正相關,除了當我正在調試時,toString()或類似的東西加回來時?我想關鍵是確保生成的時間戳是基於UTC的,而不是由MySQL本地轉換。我試圖在Hibernate查詢之前直接發送SET TIME_ZONE ='+ 0:00'SQL查詢,但這似乎沒有什麼區別。 – jdp80 2012-07-27 09:14:47
是的。我不知道您使用哪種方法顯示時間戳,但它不包含任何時區。 – 2012-07-27 09:17:04