Spring Boot+Hibernate查询MySQL时dateCreated日期与数据库不符
解决Spring Boot+Hibernate返回日期与数据库不一致的问题
这个问题明显是时区处理不一致导致的:你数据库里的2018-03-06是本地时区的日期,但Hibernate读取时默认转成了UTC时间,Jackson序列化后输出的UTC时间(比如2018-03-05T18:30:00.000+0000)对应到你的本地时区刚好是前一天的晚上,所以看起来差了一天。下面是具体的解决步骤:
1. 配置Hibernate与数据库时区同步
首先要确保Hibernate在读写数据库时使用正确的时区。在application.properties(或application.yml)里添加以下配置:
# 配置Hibernate使用的时区,比如你的数据库是东八区(GMT+8) spring.jpa.properties.hibernate.jdbc.time_zone=GMT+8 # 若数据库本身用UTC存储,就设置为UTC # spring.jpa.properties.hibernate.jdbc.time_zone=UTC
这个配置会让Hibernate处理Date类型时,按照指定时区和数据库交互,避免时区转换错误。
2. 配置Jackson序列化时区
接下来要让Jackson在序列化日期时,输出正确的时区时间,而不是默认的UTC。同样在配置文件里添加:
# 设置Jackson序列化日期时使用的时区 spring.jackson.time-zone=GMT+8 # 可选:统一日期格式,避免输出带时区的复杂格式 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
这样返回的JSON里的日期就会和数据库里的数值一致了。
3. 推荐:改用Java 8日期类型(可选优化)
java.util.Date是存在时区缺陷的旧API,推荐改用Java 8的LocalDateTime(不带时区,适合存储本地时间)或ZonedDateTime(带时区)。修改你的实体类:
// 替换原来的Date导入 import java.time.LocalDateTime; // ... @Temporal(TemporalType.TIMESTAMP) @Column(name = "created_date", nullable = false, updatable = false) @CreatedDate private LocalDateTime dateCreated; // 对应的getter和setter public LocalDateTime getDateCreated() { return dateCreated; } public void setDateCreated(LocalDateTime dateCreated) { this.dateCreated = dateCreated; }
使用LocalDateTime可以从根源上避免很多时区相关的坑,而且Spring Boot和Hibernate对Java 8日期类型的支持已经非常完善。
验证修改
配置完成后,重新启动服务,用Postman测试接口,你会发现返回的dateCreated字段和数据库里的2018-03-06一致了。
内容的提问来源于stack exchange,提问作者Muthukumaran K
相关产品推荐
相关产品推荐

