【发布时间】:2020-08-11 18:39:29
【问题描述】:
- 我在 oracle db 中有一个表。该表包含一个数据类型为 Date 的 last_updt_dt 列。
-
我正在使用带有休眠版本 5.3.12 final 的 spring data jpa。 表的实体类包含如下日期字段
@Column(name = "last_updt_dt") 私有 LocalDateTime lastUpdtDt;
-
如果我通过我的应用程序插入日期并检索它,那么它会显示预期的行为。 例如,在数据库中,它显示以下值(采用 24 小时格式)
28-04-2020 00:32:02
在应用程序中,如果我的服务器时区是 AEST,那么它会将上述值显示为
2020-04-28T10:32:02
这是正确的(db中的utc值和我的应用程序中收到的AEST值正确匹配)
-
但是,我在同一个数据库表中有一些现有记录。 如果我尝试检索这些记录,那么在我的应用程序中,日期显示错误值。 对于 Ex,数据库表显示以下值(24 小时格式)
11-01-2017 09:36:34
在应用程序中,如果我的服务器时区是 AEST,那么它会将上述值显示为
2017-01-11T20:36:34
如果我将这个 UTC 时间 09:36:34 转换为 AEST 时间,那么它给我的时间是 19:36:34,而我在这里看到的是 20:36:34,这是额外的一小时。
所以,我无法理解这种行为:
- 如果我从 Spring Boot 应用程序中插入日期并检索它,则在 db 中输入的日期与 jpa 返回的日期一致
- 但是如果我尝试读取我的应用程序未插入的日期,该日期已经存在于 db 中,那么 jpa 返回的日期与 db 值不匹配,事实上,它显示了我一个多小时的比较到预期值。该表中的所有现有日期值都会发生这种情况。 (不是我的 Spring Boot 应用程序输入的那个)
有人对此行为有任何线索吗?
我的应用程序是使用 jhipster 6.4.1 创建的,我观察到有一个包含以下方法的 DateTimeFormatConfiguration 类
@Override
public void addFormatters(FormatterRegistry registry) {
DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
registrar.setUseIsoFormat(true);
registrar.registerFormatters(registry);
}
不确定,这是否起到任何作用。
【问题讨论】:
-
你确定你真的再次重读了 JPA 实体吗?如果你在同一个事务中保存和加载,加载只是返回刚刚保存的实例而不访问数据库。
-
我强烈建议使用
Instant在数据库中存储日期或时间戳。 -
能否请您到 oracle 数据库执行“ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT='DD-MON-RR HH:MI:SSXFF AM TZR';”然后从表中选择时间戳并检查时区?
标签: oracle hibernate java-8 spring-data-jpa jhipster