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
而另一个是现代的 LocalDateTime
。 ResultSet
及其方法包括 getObject
在驱动程序中实现。
Link
Arvind Kumar Avinash’s answer to Dates with no time or timezone component in Java/MySQL。这是一个不同的问题,但该答案包含很多有用的信息,我认为这些信息对您也很有用。
我有一个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
而另一个是现代的 LocalDateTime
。 ResultSet
及其方法包括 getObject
在驱动程序中实现。
Link
Arvind Kumar Avinash’s answer to Dates with no time or timezone component in Java/MySQL。这是一个不同的问题,但该答案包含很多有用的信息,我认为这些信息对您也很有用。