首页 > 解决方案 > 使用 ResultSet.getString() 或 ResultSet.getTimestamp() 获取时间戳更好吗?

问题描述

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

目前我正在使用resultSet.getString("startDate")它,它工作正常,但在我看来,使用getTimestamp().

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

标签: javadatetimestampresultset

解决方案


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

两者都不。

获取日期时间对象比获取字符串更好,因为这更好地表示事物的含义和含义,并且应该更适合 Java 程序中的进一步操作。

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

JDBC 驱动程序略有不同,但请查看您是否可以获得正确的时间作为 a Instant、 anOffsetDateTime或者如果所有其他方法都失败,LocalDateTime则从结果集中获得 a 。在所有情况下都使用双参数getObject方法。例如:

Instant instant = resultSet.getObject("startDate", Instant.class);

JDBC 4.2指定应该以这种方式支持 java.time 类。我相信所有当前的 SQL 数据库引擎都有符合 JDBC 4.2 的驱动程序。

仅当您不能使用 Java 8 或更高版本时,Timestamp请在代码中获取 as。接下来使用 ThreeTen-Backport 中的 java.time 类的版本,使用 ThreeTen-Backport 中的DateTimeUtils类将您的Timestamp, 最好转换为 en Instant,但如果由于时区问题而发生错误的瞬间,那么LocalDateTime. 例子:

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

推荐阅读