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

Bas*_*que 28 java datetime jdbc java-time

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

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

pic*_*ypg 48

旧类的新方法

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

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

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

例:

preparedStatement.setTimestamp( 2, Timestamp.from(instant) );
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,如本答案所示,您可以申请[`ZoneOffset`](http://docs.oracle.com/javase/8/docs/api/java/time/ZoneOffset.html)得到[`OffsetDateTime`](http://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html),或者更好的是,应用[`ZoneId`](http:/ /docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html)获取[`ZonedDateTime`](http://docs.oracle.com/javase/8/docs/api/的java /时间/ ZonedDateTime.html).有关详细信息,请参阅另一个问题的[我的答案](http://stackoverflow.com/a/36639155/642706)和[我的图表](http://i.stack.imgur.com/5yzFN.png). (3认同)
  • 感谢您的回答和见解.我专注于JDBC驱动程序,并没有考虑查看`java.sql.Timestamp`类'的新功能. (2认同)

skr*_*ger 6

无需转换

\n\n

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

\n\n

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

\n\n

因此无需转换,无需再次使用 java.sql 类型。仅使用java.time包中的替代品,如此列表中所示。

\n\n
PostgreSQL\xe2\x84\xa2                      Java SE 8 (java.time)\nDATE                             LocalDate\nTIME [ WITHOUT TIMEZONE ]        LocalTime\nTIMESTAMP [ WITHOUT TIMEZONE ]   LocalDateTime\nTIMESTAMP WITH TIMEZONE          OffsetDateTime or Instant\n
Run Code Online (Sandbox Code Playgroud)\n\n

这可以通过检索ResultSet::getObject

\n\n
ResultSet rs = ...;\nwhile (rs.next()) {\n  LocalDate localDate = rs.getObject(1, LocalDate.class));\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

通过调用 来存储java.timePreparedStatement::setObject对象。

\n\n
myPreparedStatement.setObject( \xe2\x80\xa6 , myInstant ) ; \n
Run Code Online (Sandbox Code Playgroud)\n