我正在从事一个java web项目,该项目使用:
冬眠 5.2.2
/日本邮政 2.0
+ MySQL5InnoDBDialect
mysql数据库 5.6.15
- innoDB
(在easyphp/phpmyadmin上)+jdbc connector 6.0.4
joda时间api 2.9.4
+fasterxmlJacksonapi 2.8.3
我在插入时遇到了一个问题 Time
数据库中的数据。每次我把一行,我得到一个+1h值的时间列!
上的属性 Java
:
@jsonformat(shape=jsonformat.shape.string,pattern=“hh:mm”)
@列(name=“res\u duree”,nullable=false)
@时间(temporaltype.time)私有日期;
上的属性 SQL
:
恢复时间不为空;
编辑(在adrian shum的评论之后):
连接线:
jdbc.url=jdbc:mysql://localhost:3306/mydb?useunicode=true&usejdbccomplianttimezoneshift=true&uselegacydatetimecode=false&servertimezone=utc
我确实使用utc,但它仍然是1h+。
任何建议都会有帮助的,谢谢。
1条答案
按热度按时间omtl5h9j1#
通常是服务器和数据库时区不匹配造成的。
简言之,
java.util.Date
不包含时区信息。从概念上讲,您可以将其视为简单地表示日期+时间(类似于joda/jsr310)LocalDateTime
正在做)。因此,如果应用服务器为utc+10,数据库为utc+2,则当您保存日期“2016-10-13 10:11:12”时,尽管应用服务器将其视为“2016-10-13 10:11:12+10:00”,但它只是将“2016-10-13 10:11:12”传递给数据库。如果db是utc+2,它认为时间实际上意味着“2016-10-13 10:11:12+02:00”。如果您的jdbc连接被称为“utc+10”,情况会变得更加混乱,大多数db会“巧妙地”将“2016-10-13 10:11:12+02:00”转换为“2016-10-13 18:11:12+10:00”,从而导致存储和检索的时间怪异。您可以通过跟踪相应插入的sql(以及使用的实际值)进行诊断,然后选择。您应该看到这些值与表中存储的值之间的差异。这种追踪可以通过其他方式进行,例如。
旧版本的hibernate可以通过打开适当的记录器来显示prepared语句中使用的参数
您可以使用像jdbcdslog这样的工具(免责声明:我是jbdcdslog分支的维护者)http://github.com/adrianshum/jdbcdslog)
dbms端可能有跟踪传入查询的工具。
最好的解决方法是确保所有的东西都在同一个时区,最合理的时区选择是utc。