gpt4 book ai didi

java - JPA 保留的 OffsetDateTime 相差 2 小时

转载 作者:行者123 更新时间:2023-12-01 14:32:20 28 4
gpt4 key购买 nike

我有一个带有 OffsetDateTime 的 JPA 实体类像这样的字段:

@Entity
class MyEntity(clock: Clock) {
// ...
val created: OffsetDateTime = OffsetDateTime.now(clock)
}

在存储库测试中,我检查日期是否正确映射:
assertThat(entity.created).isEqualTo(defaultDateTime)

如果我比较底层 Instant (而不是偏移量)与 OffsetDateTime#isEqual有用:
assertThat(entity.created.isEqual(defaultDateTime)).isTrue()
defaultDateTimeclock使用以下代码创建:
val defaultDateTime: OffsetDateTime =
OffsetDateTime.of(2019, 6, 15, 11, 48, 59, 0, ZoneOffset.UTC)

fun createTestClock(dateTime: OffsetDateTime = defaultDateTime) =
Clock.fixed(dateTime.toInstant(), ZoneId.of("UTC"))

但是如果我运行我的测试,时间正好相差 2 小时(我所在地区,中欧的实际偏移量是多少)。 PostgreSQL 数据库返回 GMT如果我用 show timezone; 查询时区.

列数据类型为:
timestamp with time zone not null

设置相应的 Hibernate 属性无济于事:
spring.jpa.properties.hibernate.jdbc.time_zone=UTC

怎么了?

最佳答案

我相信 UTC 和 GMT 的 (UTC) 时间偏移量为 0。中欧使用 CET(中欧时间),目前的 (UTC) 偏移量为 +2。这将解释答案在 2 小时内关闭。

我建议可能在 Java 中设置默认时区(在您的主应用程序中)

@PostConstruct
void started() {
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}

和/或更改数据库时区,例如

spring.jpa.properties.hibernate.jdbc.time_zone=UTC;



spring.jpa.properties.hibernate.jdbc.time_zone=CET;

我认为问题可能是在您的机器上使用默认时区的 java。当它比较实体时,我相信它将它们作为 UTC 字符串进行比较,因此它们会匹配,但是如果您比较偏移量,您的本地可能是 CET (+2) 而时间戳是 UTC/GMT (+0)

这是一种可能性,只是我对 Java 和 Postrges 的了解比 Spring 多。

关于java - JPA 保留的 OffsetDateTime 相差 2 小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61656592/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com