Java 变量在一台机器上是时间戳,在另一台机器上是 LocalDateTime

Java variable is Timestamp on one machine and LocalDateTime on another

我有一个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

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

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

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

LocalDateTime 和其他 java.time classes 在 JDBC 4.2.

之后以这种方式被支持

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

旧 JDBC 驱动程序的替代品

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

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

或者更适合定义时间点:

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

为什么行为不同?

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

Link

Arvind Kumar Avinash’s answer to Dates with no time or timezone component in Java/MySQL。这是一个不同的问题,但该答案包含很多有用的信息,我认为这些信息对您也很有用。