【问题标题】:Java date is changing when updating date field in Oracle DB [closed]更新 Oracle DB 中的日期字段时,Java 日期正在更改 [关闭]
【发布时间】:2019-12-05 08:23:35
【问题描述】:

我正在从 xml 解析日期字段并将其存储到 oracle db 中以满足我的要求。我的 xml 日期看起来像

<BirthDate>1960-10-24T00:00:00</BirthDate>

在 unmarhsalling xml 期间,我正在获取此日期字段的 XMLGregorianCalendar 数据类型。因此,我将此对象转换为 java.util.Date,然后将其保存到 oracle DB。但它更新了一天减去。例如,它像 23-10-1960. 这样更新。如何解决此问题并使用 xml 上的实际日期对其进行更新。

这是我的代码:

myEntity.setBirthDate(xmlDomain.getBirthDate().toGregorianCalendar().getTime());

【问题讨论】:

  • 这可能是一个时区问题,但如果没有看到您的任何代码,除了猜测之外,任何人都无法做任何事情。
  • 好吧,我曾经遇到过完全相同的问题。正如@JimGarrison 指出的那样,您的 oracle 数据库所考虑的和您的 java 运行时所考虑的存在时区差异。
  • @JimGarrison:我已经更新了我的代码..
  • 如前所述,您的 Oracle DB 和 Java 是否在同一时区?
  • java 时区是 IST,DB 时区是 UTC

标签: java spring-boot java-8 java.util.date


【解决方案1】:

避免使用旧的日期时间类

您不应该使用java.util.Date。几年前,随着 JSR 310 的采用,这个可怕的类被取代了。

java.time

Convert 从您的旧版 XMLGregorianCalendar 到现代的 ZonedDateTime 类,通过另一个可怕的旧版 GregorianCalendar

ZonedDateTime zdt = myXmlGregCal.toGregorianCalendar().toZonedDateTime() ;

TIMESTAMP WITH TIME ZONE专栏

要在类似于 SQL 标准类型 TIMESTAMP WITH TIME ZONE 的类型列中将此时刻写入数据库,请使用 JDBC 4.2 将 ZonedDateTime 转换为 OffsetDateTime。奇怪的是,JDBC 规范要求支持OffsetDateTime,但不支持InstantZonedDateTime

OffsetDateTime odt = zdt.toOffsetDateTime() ;

传递给你准备好的语句。

myPreparedStatement.setObject( … , odt ) ;

检索。

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

DATE专栏

如果写入仅日期类型列,类似于 SQL 标准类型 DATE,则使用 LocalDate 类。

LocalDate ld = zdt.toLocalDate() ;  // If the zone of that ZonedDateTime object is the zone by which you want to perceive the date.
myPreparedStatement.setObject( … , ld ) ;

检索。

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多