关于datetime:如何在没有JDBC 4.2驱动程序的情况下从java.sql.Timestamp获取java.time对象?

How to get a java.time object from a java.sql.Timestamp without a JDBC 4.2 driver?

通过JDBC 4.1或更早版本从数据库中检索java.sql.Timestamp时,如何获取/转换为java.time对象?

Postgres的开源JDBC驱动程序都没有兼容JDBC 4.2,所以我正在寻找一种方法来使用java.time和JDBC 4.1。


旧类的新方法

通过在Java 8及更高版本中使用驱动程序,您应该自动在java.sql.Timestamp对象上自行选取一些方法。 java.sql.Timejava.sql.Date都有类似的转换方法。

也就是说,要从java.sql转换为java.time,您正在寻找:

  • Timestamp::toInstant()
  • Timestamp::toLocalDateTime()
  • Date::toLocalDate()
  • <5233>

要从另一个方向,从java.time到java.sql,请使用新的静态方法:

  • Timestamp.from(instant)
  • Timestamp.valueOf(localDateTime)
  • Date.valueOf(localDate)
  • Time.valueOf(localTime)

例:

1
preparedStatement.setTimestamp( 2, Timestamp.from(instant) );


无需转换

正如其他人在评论中所说,PostgreSQL的JDBC驱动程序现在支持JDBC 4.2,包括Java 8 Time API支持。我们可以直接用数据库交换java.time对象。

https://jdbc.postgresql.org/documentation/head/8-date-time.html

所以不需要转换,也不需要再次使用java.sql类型。仅使用java.time包中的替换项,如此列表中所示。

1
2
3
4
5
PostgreSQL?                      Java SE 8 (java.time)
DATE                             LocalDate
TIME [ WITHOUT TIMEZONE ]        LocalTime
TIMESTAMP [ WITHOUT TIMEZONE ]   LocalDateTime
TIMESTAMP WITH TIMEZONE          OffsetDateTime or Instant

这可以通过ResultSet::getObject检索

1
2
3
4
ResultSet rs = ...;
while (rs.next()) {
  LocalDate localDate = rs.getObject(1, LocalDate.class));
}

通过调用PreparedStatement::setObject存储java.time对象。

1
myPreparedStatement.setObject( … , myInstant ) ;