Java 使用ResultSet.getString()或ResultSet.getTimestamp()获取时间戳更好吗?

Java 使用ResultSet.getString()或ResultSet.getTimestamp()获取时间戳更好吗?,java,date,timestamp,resultset,Java,Date,Timestamp,Resultset,在从Postgres或Oracle检索时间戳时——我们称之为startDate——使用resultSet.getString(“startDate”)调用还是resultSet.getTimestamp(“startDate”) 目前我使用的是resultSet.getString(“startDate”),它工作得很好,但我觉得使用getTimestamp()可能是更好的做法 是否有既定的最佳实践?在时间戳上使用ResultSet.getString()会产生任何意外后果吗?我将使用Resul

在从Postgres或Oracle检索时间戳时——我们称之为
startDate
——使用
resultSet.getString(“startDate”)
调用还是
resultSet.getTimestamp(“startDate”)

目前我使用的是
resultSet.getString(“startDate”)
,它工作得很好,但我觉得使用
getTimestamp()
可能是更好的做法


是否有既定的最佳实践?在时间戳上使用
ResultSet.getString()
会产生任何意外后果吗?

我将使用ResultSet.getTimestamp()。然后数据类型从代码正确映射到数据库。如果愿意,可以将结果转换为字符串。我不认为调用resultSet.getString()会花费时间,但通常检索正确的数据类型更合适。

我会使用resultSet.getTimestamp()。然后数据类型从代码正确映射到数据库。如果愿意,可以将结果转换为字符串。我不认为调用resultSet.getString()会花费时间,但通常检索正确的数据类型更合适

使用ResultSet.getString()或ResultSet.getTimestamp()更好吗 要得到时间戳

都不是

获取一个日期时间对象比获取一个字符串要好,因为它能更好地表示事物的性质和含义,并且能更好地用于Java程序中的进一步操作

同时,使用java.time中的现代日期时间类比老式的
Timestamp
类要好得多。后者有相当大的设计问题,长期以来被认为是过时的

JDBC驱动程序有点不同,但请查看是否可以从结果集中获取正确的时间,如
即时时间、
偏移日期时间,或者如果所有其他操作都失败,则获取
LocalDateTime
。在所有情况下,都使用双参数
getObject
方法。例如:

Instant instant = resultSet.getObject("startDate", Instant.class);
指定应以这种方式支持java.time类。我相信所有当前的SQL数据库引擎都有JDBC4.2兼容的驱动程序

只有当您不能使用Java 8或更高版本时,才能像在代码中一样获取时间戳。接下来,使用Threen Backport中的java.time类和Threen Backport中的类将
时间戳转换为en
Instant
,最好是en
Instant
,但如果由于时区问题,这恰好给您提供了错误的Instant,则使用
LocalDateTime
。例如:

Instant instant = 
    DateTimeUtils.toInstant(
        resultSet.getTimestamp("startDate")
    )
;
使用ResultSet.getString()或ResultSet.getTimestamp()更好吗 要得到时间戳

都不是

获取一个日期时间对象比获取一个字符串要好,因为它能更好地表示事物的性质和含义,并且能更好地用于Java程序中的进一步操作

同时,使用java.time中的现代日期时间类比老式的
Timestamp
类要好得多。后者有相当大的设计问题,长期以来被认为是过时的

JDBC驱动程序有点不同,但请查看是否可以从结果集中获取正确的时间,如
即时时间、
偏移日期时间,或者如果所有其他操作都失败,则获取
LocalDateTime
。在所有情况下,都使用双参数
getObject
方法。例如:

Instant instant = resultSet.getObject("startDate", Instant.class);
指定应以这种方式支持java.time类。我相信所有当前的SQL数据库引擎都有JDBC4.2兼容的驱动程序

只有当您不能使用Java 8或更高版本时,才能像在代码中一样获取时间戳。接下来,使用Threen Backport中的java.time类和Threen Backport中的类将
时间戳转换为en
Instant
,最好是en
Instant
,但如果由于时区问题,这恰好给您提供了错误的Instant,则使用
LocalDateTime
。例如:

Instant instant = 
    DateTimeUtils.toInstant(
        resultSet.getTimestamp("startDate")
    )
;

实际上,应该避免使用Instant,因为SQL时间戳值没有指定时区。为了让JDBC驱动程序返回一个瞬间,它必须假设一个时区或从JDBC URL参数获取它,以我的经验,这是不可靠的。坚持使用LocalDateTime可以避免此问题并保证数据的准确性,而不必依赖JDBC URL的时区、服务器时区或客户端时区。@VGR您的注释不正确。SQL标准指定了两种类型的时间戳,一种与时区或UTC偏移有关,另一种不与时区或UTC偏移有关<代码>带时区的时间戳
注意输入提供的区域/偏移信息,并在检索时发送此类信息。在许多数据库(如Postgres)中,此输入信息用于调整为UTC,因此检索到的值也是UTC。一些工具/驱动程序可能会在这样的UTC值上插入他们自己关于时区的意见,这会使情况变得复杂(反功能IMHO)<代码>不带时区的时间戳
没有区域/偏移。@BasilBourque True,对于带时区的时间戳,Instant或ZonedDateTime是合适的。但是我看不到那些经常使用的。我想值得问一下ktm5124,这是否是正在使用的类型。(我同意临时区域信息是一种反功能。)@VGR在对问题的评论中这样问。实际上,应该避免使用Instant,因为SQL时间戳值没有指定时区。为了让JDBC驱动程序返回一个瞬间,它必须假设一个时区或从JDBC URL参数获取它,以我的经验,这是不可靠的。坚持使用LocalDateTime可以避免此问题并保证数据的准确性,而不必依赖JDBC URL的时区、服务器时区或客户端时区。@VGR您的注释不正确。SQL标准指定了两种类型的时间戳,一种与时区或UTC偏移有关,另一种不与时区或UTC偏移有关<代码>带时区的时间戳
注意区域/o