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

使用Spring Data JPA保存ZonedDateTime时MySQL时间少8小时问题

问题原因

Hibernate(Spring Data JPA的默认实现)对ZonedDateTime的默认处理逻辑会自动将带时区的时间转换为UTC时区后写入数据库。即使服务器和数据库都使用上海时区(UTC+8),该转换依然会执行,最终导致数据库存储的时间比调试时的实际值少8小时。

解决办法

方案1:配置Hibernate时区匹配数据库时区

在Spring Boot配置文件中指定Hibernate使用数据库所在的上海时区,覆盖默认的UTC转换逻辑:

application.properties

spring.jpa.properties.hibernate.jdbc.time_zone=Asia/Shanghai

application.yml

spring:
  jpa:
    properties:
      hibernate:
        jdbc:
          time_zone: Asia/Shanghai

方案2:为实体字段指定时区存储规则

在ZonedDateTime字段上通过columnDefinition明确数据库字段的时区类型(需MySQL 8.0+支持):

@Column(name = "CREATE_TIME", columnDefinition = "TIMESTAMP WITH TIME ZONE")
private ZonedDateTime createTime;

同时配合方案1的时区配置,确保读写时的时区一致性。

方案3:改用LocalDateTime简化处理

若无需保留时区信息(服务器与数据库时区一致),将实体字段类型改为LocalDateTime,并添加全局时区配置:

@Column(name = "CREATE_TIME")
private LocalDateTime createTime;

配置文件补充:

application.properties

spring.jackson.time-zone=Asia/Shanghai
spring.jpa.properties.hibernate.jdbc.time_zone=Asia/Shanghai

验证

修改配置后重新执行保存操作,检查数据库中CREATE_TIME字段值是否与调试时的实际时间一致。

内容的提问来源于stack exchange,提问作者kimler jin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:42:38