2012-07-26 91 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