java变量是一台机器上的时间戳和另一台机器上的localdatetime

flvlnr44  于 2021-10-10  发布在  Java
关注(0)|答案(1)|浏览(473)

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

这是在时间戳1上,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没有任何内容,我认为它可能是一些配置,但我找不到任何东西,如果有人能给我一个指南或一个地方看,我将不胜感激。

2lpgd968

2lpgd9681#

如果jdbc驱动程序允许,请指定所需的 LocalDateTime 每次:

LocalDateTime teste = rs.getObject(i, LocalDateTime.class);
``` `LocalDateTime` 自JDBC4.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` 另一个是现代的 `LocalDateTime` .  `ResultSet` 其方法包括 `getObject` 在驱动程序中实现。
链接
arvind kumar avinash对java/mysql中没有时间或时区组件的日期的回答。这是一个不同的问题,但这个答案包含了很多好的信息,我认为这些信息也会对你有用。

相关问题