Java 使用ResultSet.getString()或ResultSet.getTimestamp()获取时间戳更好吗?
在从Postgres或Oracle检索时间戳时——我们称之为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
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中的类将时间戳转换为enInstant
,最好是enInstant
,但如果由于时区问题,这恰好给您提供了错误的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中的类将时间戳转换为enInstant
,最好是enInstant
,但如果由于时区问题,这恰好给您提供了错误的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