我们有一个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