我正在开发一个使用以下内容的java web项目:
Hibernate 5.2.2
/ JPA 2.0
+ MySQL5InnoDBDialect
MySQL 5.6.15
- innoDB
(在EasyPHP / PHPMyAdmin上)+ JDBC connector 6.0.4
2.9.4
+ Fasterxml jackson API 2.8.3
我在数据库中插入Time
数据时遇到问题。每次我排成一排,我在时间栏上得到+ 1H值!
Java
上的属性:@JsonFormat(shape = JsonFormat.Shape.STRING,pattern =“ HH:mm ”)
@Column(name =“RES_DUREE”,nullable = false)
@Temporal (TemporalType。 TIME )私有日期 resDuree;
SQL
上的属性:RES_DUREE TIME NOT NULL;
编辑(在Adrian Shum的评论之后):
jdbc.url = JDBC:MySQL的://本地主机:3306 / MYDB了useUnicode =真安培; useJDBCCompliantTimezoneShift =真安培;的 useLegacyDatetimeCode =假&安培;的 serverTimezone = UTC
我确实使用UTC但它仍然是1H + 任何建议都会有所帮助,谢谢。
答案 0 :(得分:1)
通常它是由服务器和数据库时区不匹配引起的。
简而言之,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。鉴于DB是UTC + 2,它认为时间实际意味着" 2016-10-13 10:11:12 +02:00 "。如果声称你的JDBC连接是" UTC + 10"则情况变得更加混乱,大多数数据库将会巧妙地"智能地"翻译" 2016-10-13 10 :11:12 + 02 :00"到" 2016-10-13 18 :11:12 + 10 :00"这导致存储和检索奇怪的时间。
您可以通过跟踪相应插入的SQL(以及使用的实际值)进行诊断并选择。您应该看到值与表中存储的值之间存在差异。这种跟踪可以通过misc方式完成,例如
解决的最佳方法是确保所有内容都在同一时区,时区最合理的选择是 UTC 。