【问题标题】:TIMESTAMP WITH TIME ZONE vary between OJDBC6 and OJDBC8TIMESTAMP WITH TIME ZONE 在 OJDBC6 和 OJDBC8 之间有所不同
【发布时间】:2021-01-02 15:18:51
【问题描述】:

我确实对 OJDBC8 有疑问。前段时间我决定从 OJDBC6 -> OJDBC8 和一些在停止工作之前工作的功能切换。我有一个带有 GMT-4 和所有其他属性的日历对象。当我使用 OJDBC6 时,下面的代码可以正常工作,TIMESTAMP 会调整为时区。

rs.getTimestamp(1, calendar)

当使用OJDBC8并且与上面相同的代码没有调整时间戳时,基本上时间戳不会改变它与数据库中的值相同。我检查了 OJDBC8 代码,版本 6 和 8 之间的逻辑不同。我不明白为什么我们将日历对象传递给 getTimestamp() 方法,但它甚至没有在 OJDBC8 中使用。

【问题讨论】:

  • 时间戳调整到时区是什么意思? java.sql.Timestamp 是独立于时区的时间点。该类的设计也很糟糕并且已经过时了,所以你可能想摆脱它。

标签: java oracle datetime timestamp ojdbc


【解决方案1】:

请注意,ojdbc8 的 Java 编译器级别是 Java-8,而 ojdbc6 的 Java 编译器级别是 Java-6。在 Java-8 中,引入了 a completely new date-time API。旧的日期时间 API (java.util) 容易出错,使用它们的代码过去很复杂且难以理解。

您应该使用现代日期时间 API (java.time) 并按以下方式进行操作:

OffsetDateTime odt = rs.getObject(1, OffsetDateTime.class);

Trail: Date Time

了解有关现代日期时间 API 的更多信息

您为切换到现代日期时间 API 所做的更改将是值得的,并且会长期为您提供帮助。

【讨论】:

  • 这似乎没问题,但问题是我已经有一个基于用户时区定义的日历,我想用这个特定的日历投射 TIMESTAMP。以前我可以使用 getTimestamp(timestamp, calendar) 方法毫无问题地做到这一点,但由于 OJDBC8 的实现不同,这不起作用。使用您提出的解决方案,我需要修改大量代码并删除所有 getTimestamp() 方法,以便用 getObject() 替换它们。
猜你喜欢
  • 2023-01-10
  • 2011-03-14
  • 2012-04-04
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 2021-08-24
  • 2017-06-01
  • 2015-07-01
相关资源
最近更新 更多