【发布时间】:2020-05-08 17:19:28
【问题描述】:
我的代码中出现了这种奇怪的现象。我正在使用 spring data jpa 和 MySQL 数据库。我有一个名为“提交”的表,其中包含名为“finishedAt”的日期字段。该字段的数据类型是:“日期”。
我在 Java 中有一个映射类:
@Entity
@Table(name = "Submission")
@Getter
@Setter
public class Submission{
//All the fields here
@Temporal(javax.persistence.TemporalType.DATE)
java.util.Date finishedAtValue
}
有一种方法会尝试访问此日期值。当我打印日期时,我会看到前一天的值。
例子:
假设数据库中的日期值为 2020-06-05 (yyyy-mm-dd)
方法中的sn-p代码如下:
//Code to get the entity from database successfully - submission
log.info("DateTimeAnswer retrieved from database: "+submission.getFinishedAtValue);
/*Expected date value from above log: 2020-06-05
Actual date value from above log: 2020-06-04*/
在提取此日期值时无法理解为什么会出现这种不一致。任何帮助,将不胜感激。谢谢!
【问题讨论】:
-
最可能的原因是应用程序中的时区与数据库使用的会话时区不匹配。 MySQL 也有许多日期错误。数据库、客户端和会话中的时区是什么?在您的应用程序中,使用 JPA 数据库连接记录
TimeZone.getDefault()的结果和SELECT @@global.time_zone, @@session.time_zone的结果。 -
另请参阅最新 MySQL Connector/J 驱动程序的发行说明,该驱动程序修复了
Date处理中的错误:dev.mysql.com/doc/relnotes/connector-j/8.0/en/news-8-0-20.html -
数据库时区和应用时区不同。 SELECT @@global.time_zone 返回 +03.00 和 TimeZone.getDefault() 返回 sun.util.calendar.ZoneInfo[id="America/Denver"]
-
但是
@@session.time_zone呢? -
返回+03.00。
标签: java date java.util.date