Spring boot 3.2.x 升级后,ZoneddateTime 始终以 UTC 格式保存在数据库中

问题描述 投票:0回答:1

工作场景:

服务-A:使用 Java 8,Spring boot 2.7.x

  • 在java对象中设置ZoneddateTime(“America/New_York”)并添加 它在 RabbitMQ 队列中。

服务-B:使用Java 8,Spring boot 2.7.9

  • 从队列接收 ZoneddateTime 并将其保存在 MySql DB 中。
  • ZoneddateTime 按预期以 EST/EDT 格式保留。

Mysql 数据库:

  • 查询结果(SELECT @@system_time_zone;)是 EDT。
  • MySQL 中存储 ZoneddateTime 的数据类型列是 - datetime

问题:

将 Service-B(在数据库中保存日期时间的服务)升级到 Java 17 和 Spring boot 3.2.9 后。 ZoneddateTime 正在获取持久的 UTC 格式(EDT + 4 小时)

调试:

  1. 我尝试将时间转换为 EDT/EST,然后保留在 DB 中。但它仍然只以 UTC 格式存储。
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;在我们班

  1. 我使用 Java 17 将 Spring Boot 版本降级到 2.7.9。ZoneddateTime 按预期以 EST/EDT 格式保留。所以我猜这个问题不是由于 Java 升级造成的。

有任何解决此问题或进一步调试的建议或建议吗?我希望日期时间应该是 EDT/EST 格式。

java spring-boot spring-data-jpa zoneddatetime
1个回答
0
投票

此问题是由于 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 的行为。

© www.soinside.com 2019 - 2024. All rights reserved.