【问题标题】:Spring data jpa returning inconsistent values of Date from oracle database tableSpring data jpa从oracle数据库表中返回不一致的日期值
【发布时间】: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


【解决方案1】:

感谢大家的回答。 我发现了这个问题。 代码/spring 数据 jpa/oracle/jhipster 没有问题。 问题出在我的计算上。

我觉得没有按照我的预期工作的日期是这样的: 11-01-2017 09:36:34

此 UTC 日期是 2020 年 1 月 11 日,如果我将其转换为 AEST,则为 +11 小时,因为它是在夏令时。所以我的应用程序向我显示了正确的日期时间,即 2017-01-11T20:36:34。

我觉得工作正常的日期是这个: 28-04-2020 00:32:02 这个 UTC 日期 2020 年 4 月 28 日没有夏令时,如果我想将其转换为 AEST,那么我应该增加 +10 小时。

基本上我在比较错误的日期,一个是在夏令时,另一个是在夏令时结束后,这就是为什么,我得到不同的结果,我认为我的应用程序在某个地方失败,无法给我一致的日期时间。但是这不是真的,我应用了错误的计算。

【讨论】:

    猜你喜欢
    • 2014-12-24
    • 1970-01-01
    • 2021-06-24
    • 2021-07-01
    • 1970-01-01
    • 2015-07-31
    • 2017-06-05
    • 2022-10-13
    • 1970-01-01
    相关资源
    最近更新 更多