问题描述
我有一个 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
我觉得跟版本没有关系,因为只是一个补丁,看了changelog也没啥,我觉得可以是一些配置,但是我找不到任何东西,如果有人能给我一个指南或一个看的地方,我将不胜感激。
解决方法
如果您的 JDBC 驱动程序允许,请指定每次都需要 LocalDateTime
:
LocalDateTime teste = rs.getObject(i,LocalDateTime.class);
LocalDateTime
和其他 java.time 类从 JDBC 4.2 开始以这种方式支持。
更好的是,假设您的时间戳就是这样,定义一个时间点,使用 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
而另一个返回现代 LocalDateTime
。 ResultSet
及其方法(包括 getObject
)在驱动程序中实现。
链接
Arvind Kumar Avinash’s answer 到 Dates with no time or timezone component in Java/MySQL。这是一个不同的问题,但该答案包含很多我认为对您也有用的好信息。