尽管 UTC,Java / Hibernate Timestamp 仍受到夏令时的影响

Posted

技术标签:

【中文标题】尽管 UTC,Java / Hibernate Timestamp 仍受到夏令时的影响【英文标题】:Java / Hibernate Timestamp being affected by daylight savings despite UTC 【发布时间】:2021-08-25 16:57:50 【问题描述】:

我正在从 Postgres 查询到 Java。

我已将 Postgres 和 Java 都设置为使用 'UTC'。

但是,当我出于某种原因进行查询时,日期会受到夏令时跳跃的影响。

我将休眠设置为 UTC。 (pom.xml)。

<properties>
    <spring-boot.run.jvmArguments>-Duser.timezone=UTC</spring-boot.run.jvmArguments>
    <property name="hibernate.jdbc.time_zone" value="UTC"/>
</properties>

我的 postgres 时区设置为 UTC。 时区 = 'UTC'(重新启动的服务) 当我查询 postgres 时,我没有得到问题。 此外,当我在 java 中手动设置日期然后递增时,我没有得到问题。

似乎只有当我出于某种原因查询和使用休眠时,它才会在一段时间内“忽略”UTC并跳过一小时。

我也许能够做一些激烈的事情,比如在数据库中使用 char 与时间戳,所以休眠不会混淆,但这似乎很激烈,我一定错过了一些简单的事情?

更新:因此,将所有逻辑移至存储过程并在那里执行解决了问题。我什至会说这可能是休眠的一个错误。我已将它设置为休眠以使用应该排除时区的 UTC?

【问题讨论】:

不幸的是,一些工具和中间件喜欢对从数据库中检索到的值应用时区。 Postgres 仅在 UTC 中存储 TIMESTAMP WITH TIME ZONE,始终为 UTC。 【参考方案1】:

所以在尝试了很多事情之后,它看起来像在做:

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

像一些 SO 线程建议的那样工作

但是这样做:

<properties>
    <spring-boot.run.jvmArguments>-Duser.timezone=UTC</spring-boot.run.jvmArguments>
    <property name="hibernate.jdbc.time_zone" value="UTC"/>
</properties>

什么都不做。我已经看到许多 SO 线程暗示 JVM 中的属性更改,但根据我的经验,只有 TimeZone.setDefault 可以做任何事情。

【讨论】:

以上是关于尽管 UTC,Java / Hibernate Timestamp 仍受到夏令时的影响的主要内容,如果未能解决你的问题,请参考以下文章

休眠强制时间戳以 UTC 形式持续/加载 [重复]

org.hibernate.MappingException 尽管 JPA 转换器可用

如何使用 JPA 和 Hibernate 在 UTC 时区中存储日期/时间和时间戳

R 中的时区问题,我想使用 UTC+0100,即使在夏天,尽管 CET 会自动切换到 CEST

Java local 转UTC时间

在 java 中使用 DateFormatter 获取 UTC 时间