0

我有一个 Java 应用程序,当我在一台机器上调试它时,变量的类型是 LocalDateTime,但在另一台机器上它是 Timestamp。

这是实际变量

Object teste = rs.getObject(i);

这是 LocalDateTime 之一,Apache 版本是 7.0.106,它与 Windows Server 2019 一起运行

Server version: Apache Tomcat/7.0.109
Server built:   Apr 22 2021 18:43:38 UTC
Server number:  7.0.109.0
OS Name:        Windows Server 2019
OS Version:     10.0
Architecture:   amd64
JVM Version:    1.8.0_291-b10
JVM Vendor:     Oracle Corporation

这是时间戳一,Apache 版本是 7.0.109,它与 Windows 10 一起运行

Server version: Apache Tomcat/7.0.106
Server built:   Sep 16 2020 08:33:41 UTC
Server number:  7.0.106.0
OS Name:        Windows 10
OS Version:     10.0
Architecture:   amd64
JVM Version:    1.8.0_271-b09
JVM Vendor:     Oracle Corporation

我不认为它与版本有关,因为它只是一个补丁,并且阅读更新日志没有任何关于它的内容,我认为它可能是一些配置,但我找不到任何东西,如果有人可以的话给我一个指南或一个地方看,我将不胜感激。

4

1 回答 1

3

如果您的 JDBC 驱动程序允许,请指定您希望LocalDateTime每次:

LocalDateTime teste = rs.getObject(i, LocalDateTime.class);

LocalDateTime从 JDBC 4.2 开始,以这种方式支持其他 java.time 类。

更好的是,假设您的时间戳就是这样,定义一个时间点,使用OffsetDateTime,而不是LocalDateTime。在大多数 SQL 数据库中,您将需要使用timestamp with time zone.

旧 JDBC 驱动程序的替代品

如果指定一个 java.time 类来getObject()中断,最好将您的 JDBC 驱动程序升级到它可以工作的那个。如果由于某种原因您不能这样做,请检索老式Timestamp并转换它。

LocalDateTime teste = rs.getTimestamp(i).toLocalDateTime();

或者更好地定义一个时间点:

Instant teste = rs.getTimestamp(i).toInstant();

为什么行为不同?

可能您在这两台计算机上安装了不同版本的 JDBC 驱动程序。这可以解释为什么一个返回老式Timestamp而另一个返回现代LocalDateTimeResultSet及其方法包括getObject在驱动程序中实现。

关联

Arvind Kumar AvinashDates with no time or timezone component in Java/MySQL的回答。这是一个不同的问题,但该答案包含许多我认为对您也有用的好信息。

于 2021-07-23T05:03:42.517 回答