mysql/hibernate:在插入类型time上获取值+1h

2w3kk1z5  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(251)

我正在从事一个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+。
任何建议都会有帮助的,谢谢。

omtl5h9j

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。

相关问题