You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:21:10