gpt4 book ai didi

spring - 在 Oracle Timestamp 列中以 UTC 格式保存日期

转载 作者:行者123 更新时间:2023-12-04 02:44:12 30 4
gpt4 key购买 nike

我需要将当前 UTC 日期和时间保存在类型为 TIMESTAMP WITH TIMEZONE 的 Oracle 列中。这是来自带有 JPA 和 Hibernate 的 Spring Boot 服务

我在我的应用程序 yml 中启用了以下内容

  jpa:
hibernate:
ddl-auto: none
show-sql: true
properties:
hibernate:
dialect: org.hibernate.dialect.Oracle12cDialect
jdbc:
time_zone: UTC

实体类字段看起来像

@Column(name = "last_user_edit_date", columnDefinition = "TIMESTAMP WITH TIME ZONE")
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private ZonedDateTime lastUserEditDate;

在设置日期时我正在使用

obj.setLastUserEditDate(ZonedDateTime.of(LocalDateTime.now(), ZoneId.of("UTC")));

以上关于实际日期值的工作正常。唯一的问题是在数据库中,它正在保存 UTC 时间,但提到 MST(我的本地时区)作为时区。例如,保存的值是

12-SEP-19 09.50.53.820000000 PM 美国/丹佛

这里的 9.50 PM 实际上是 UTC 时间,但时区是 AMERICA/DENVER。我想要的是

12-SEP-19 09.50.53.820000000 PM UTC

如何使用 Java 8 类实现此 Spring JPA?

谢谢

最佳答案

LocalDateTime 是错误的类

LocalDateTime 类无法及时跟踪时刻。我无法想象调用 LocalDateTime.now() 有意义的场景。在使用类之前阅读 Javadoc。

跟踪时刻:InstantOffsetDateTimeZonedDateTime

要跟踪时刻,请使用 Instant(始终采用 UTC)、OffsetDateTime(与 UTC 偏移的时刻)或 ZonedDateTime(在特定区域看到的时刻)。

奇怪的是,JDBC 4.2 需要支持 OffsetDateTime,但留下最常见的两个类,InstantZonedDateTime 是可选的。

因此,要为 JDBC 工作捕获 UTC 中的当前时刻:

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;

或更长的时间:

Instant instant = instant.now() ;  // Capture current moment in UTC.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;

发送到数据库:

myPreparedStatement.setObject( … , odt ) ;

从数据库中检索:

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

JPA

我不使用 JPA .但看起来这个问题已经解决了,JPA Storing OffsetDateTime with ZoneOffset .看看这篇文章,What’s new in JPA 2.2 – Java 8 Date and Time Types .

其他时区和时差

only problem is in the database it is saving the UTC time but mentions MST

This documentation对于 Oracle 数据库,似乎说 TIMESTAMP WITH TIME ZONE 类型确实记录了传入数据的时区或与 UTC 的偏移量。其他一些数据库(例如 Postgres)将传入值调整为 UTC(零小时-分钟-秒的偏移量)。

要获取 UTC,如上所示检索 OffsetDateTime,并调用 toInstant 方法以生成始终采用 UTC 的 Instant 对象。或生成另一个绝对采用 UTC 的 OffsetDateTime:

OffsetDateTime odtUtc = odt.withOffsetSameInstant​( ZoneOffset.UTC ) ;

Table of date-time types in Java (both legacy and modern) and in standard SQL.

关于spring - 在 Oracle Timestamp 列中以 UTC 格式保存日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57915107/

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