尽管 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 仍受到夏令时的影响的主要内容,如果未能解决你的问题,请参考以下文章
org.hibernate.MappingException 尽管 JPA 转换器可用
如何使用 JPA 和 Hibernate 在 UTC 时区中存储日期/时间和时间戳