工作场景:
服务-A:使用 Java 8,Spring boot 2.7.x
服务-B:使用Java 8,Spring boot 2.7.9
Mysql 数据库:
问题:
将 Service-B(在数据库中保存日期时间的服务)升级到 Java 17 和 Spring boot 3.2.9 后。 ZoneddateTime 正在获取持久的 UTC 格式(EDT + 4 小时)
调试:
final ZonedDateTime inboundTimeEST = inboundTime.withZoneSameInstant("America/New_York"); obj.setRequestTime(inboundTimeEST); obj.setMyJson(XXX().getBytes()); // Json in bytes logsRepository.save(obj);
obj 来自我们的实体类。请求时间的数据类型是ZonedDateTime。导入这两个包 import jakarta.persistence.*;import java.time.ZonedDateTime;在我们班
有任何解决此问题或进一步调试的建议或建议吗?我希望日期时间应该是 EDT/EST 格式。
此问题是由于 Hibernate 6.x 行为的更改所致。
Spring Boot 2.x 使用 Hibernate 5.x ,但 Spring Boot 3.x 使用 Hibernate 6.x 。
在 Hibernate 5 中,时区不被存储,而是默认标准化为 hibernate.jdbc.time_zone / JVM 时区中设置的时区。但在 Hibernate 6.x 中,日期/时间值被标准化为 UTC。
更多详细信息请参阅Hibernate 迁移指南
因此,将配置属性 hibernate.timezone.default_storage 设置为 NORMALIZE 将恢复到 Hibernate 5 的行为。