Tat*_*tha 3 oracle spring java-8 spring-data-jpa spring-boot
我需要将当前 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
Run Code Online (Sandbox Code Playgroud)
实体类字段看起来像
@Column(name = "last_user_edit_date", columnDefinition = "TIMESTAMP WITH TIME ZONE")
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private ZonedDateTime lastUserEditDate;
Run Code Online (Sandbox Code Playgroud)
在设置日期时我正在使用
obj.setLastUserEditDate(ZonedDateTime.of(LocalDateTime.now(), ZoneId.of("UTC")));
Run Code Online (Sandbox Code Playgroud)
以上相对于实际日期值工作正常。唯一的问题是在数据库中它正在保存 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
我怎样才能实现这个 Spring JPA 和 Java 8 类?
谢谢
LocalDateTime 是错误的类该LocalDateTime班是不是能够及时跟踪时刻。我无法想象呼叫LocalDateTime.now()有意义的场景。在使用类之前阅读 Javadoc。
Instant, OffsetDateTime,ZonedDateTime要跟踪某个时刻,请使用Instant(始终使用UTC)、OffsetDateTime(与 UTC 有偏移的时刻)或ZonedDateTime(在特定区域中看到的时刻)。
奇怪的是,JDBC 4.2 需要支持OffsetDateTime但留下了最常见的两个类Instant&ZonedDateTime可选。
因此,要在 UTC 中捕获 JDBC 工作的当前时刻:
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;
Run Code Online (Sandbox Code Playgroud)
或者更长:
Instant instant = instant.now() ; // Capture current moment in UTC.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
Run Code Online (Sandbox Code Playgroud)
发送到数据库:
myPreparedStatement.setObject( … , odt ) ;
Run Code Online (Sandbox Code Playgroud)
从数据库中检索:
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Run Code Online (Sandbox Code Playgroud)
我不使用JPA。但看起来这个问题已经涵盖了,JPA 存储 OffsetDateTime 与 ZoneOffset。并请参阅这篇文章JPA 2.2 的新增功能 – Java 8 日期和时间类型。
唯一的问题是在数据库中它正在保存 UTC 时间但提到了 MST
Oracle 数据库的此文档似乎说该TIMESTAMP WITH TIME ZONE类型确实记录了传入数据的时区或 UTC 偏移量。其他一些数据库(例如 Postgres)将传入值调整为 UTC(零时分秒的偏移量)。
要获取 UTC,请检索OffsetDateTime如上所示,并调用toInstant方法以生成Instant始终为 UTC的对象。或者生成另一个OffsetDateTime绝对是 UTC 的:
OffsetDateTime odtUtc = odt.withOffsetSameInstant?( ZoneOffset.UTC ) ;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2473 次 |
| 最近记录: |