我的Spring应用程序时区是UTC,对应于以下配置:
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
我的 hibernate JDBC 时区在 spring boot 的 application.yaml 中配置为亚洲/德黑兰:
spring.jpa.properties.hibernate.jdbc.time_zone = Asia/Tehran
在升级到新版本的 Spring 之前,一切正常。 当我使用 spring 存储库存储日期字段时,日期存储在本地时区(亚洲/德黑兰)中。 示例代码:
basketEntity.setModifiedDateTime(ZonedDateTime.now());
basketRepository.save(basketEntity);
在上面的代码中,ZonedDateTime.now() 是 GMT 时间,因为应用程序时区和休眠将其转换为本地时区。
但是在将 spring boot 从版本 3.0.4 升级到 3.2.1 并相应地将 hibernate ORM 版本从 6.1.7.Final 升级到 6.4.1.Final 后,所有日期都存储在 GMT 上,并且显然
hibernate.jdbc.time_zone
配置无法按我的预期工作不再了。
我已确认在 Spring Boot 启动日志中应用了 Hibernate 时区配置。
请注意,我在实体中的日期字段如下所示:
@Column(name = "modified_date_time", insertable = false, columnDefinition = "datetime2")
private ZonedDateTime modifiedDateTime;
我的数据库是 SQL Server 2019,数据库中的日期字段类型是 datetime2
我存储在数据库中的日期字段数据的示例:
2024-01-09 10:52:31.6832713
附注 似乎 JVM 覆盖了最新版本的 hibernate 中 jdbc 配置的时区行为。
(我点击此链接进行应用程序设置) Hibernate 检索 UTC 时间戳
我通过在新版本的配置中设置新字段解决了问题:
将
hibernate.timezone.default_storage
设置为 NORMALIZE
我在hibernate的迁移指南中找到了解决方案: