微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我有一个 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 而另一个返回现代 LocalDateTimeResultSet 及其方法(包括 getObject)在驱动程序中实现。

链接

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。