Java 8 从ResultSet获取用于java.time类的日期

Java 8 从ResultSet获取用于java.time类的日期,java-8,resultset,getdate,java-time,Java 8,Resultset,Getdate,Java Time,从ResultSet中获取(Java 8中的新)兼容的时间类是否仍然存在 我知道您可以使用ResultSet的getDate或getTimestamp,但是这些方法返回java.sql.Date/java.sql.Timestamp对象,这些对象现在已被弃用,因此使用它们来创建ZonedDateTime或类似对象似乎是一种不好的做法。大多数数据库供应商现在还不支持。这意味着新的java.time类型,如LocalDate,将/应该使用现有的方法setObject(…)和getObject()来支

ResultSet
中获取(Java 8中的新)兼容的时间类是否仍然存在


我知道您可以使用
ResultSet
getDate
getTimestamp
,但是这些方法返回
java.sql.Date
/
java.sql.Timestamp
对象,这些对象现在已被弃用,因此使用它们来创建
ZonedDateTime
或类似对象似乎是一种不好的做法。

大多数数据库供应商现在还不支持。这意味着新的
java.time
类型,如
LocalDate
,将/应该使用现有的方法
setObject(…)
getObject()
来支持。不需要并提供显式转换(无API更改)

缺少支持的解决方法可以是手动转换,如中所述

比如:

LocalDate birthDate = resultSet.getDate("birth_date").toLocalDate();
如您所见,这些转换使用非弃用类型
java.sql.Date
等,另请参见
Timestamp
Java8在类上包含了新的方法,可以在Java.time对象之间进行转换。在JDBC驱动程序可以针对新的数据类型进行更新之前,这些方便的方法都是权宜之计

  • toLocalDateTime
  • from
日期和时间同上
java.sql.Time
类在java 8中也添加了类似的java.Time转换方法。

今天,我们大多数人都使用兼容JDBC 4.2的驱动程序,与2015年的答案相比,这大大改善了情况

要从结果集中获取
LocalDate

    LocalDate dateFromDatabase = yourResultSet.getObject(yourColumnIndex, LocalDate.class);

尚未将任何新方法添加到
ResultSet
以使其正常工作。
getObject
方法一直存在。新的是,自JDBC4.2以来,它接受
LocalDate.class
作为第二个参数,并返回
LocalDate
。当查询返回一个SQL数据类型为
date
的列时,上面的方法就起作用了(实际上,JDBC类型很重要,但它们倾向于一致)

您也可以传递其他java.time类型的类。并返回相应的类型。例如:

    OffsetDateTime dateTimeFromDatabase
            = yourResultSet.getObject(yourTimestampWithTimeZoneColumnIndex, OffsetDateTime.class);
要使用的java.time类型有:

SQL datatype            | java.time type
------------------------+-----------------------------------------------------------
date                    | LocalDate
time                    | LocalTime
timestamp               | LocalDateTime
timestamp with timezone | Officially OffsetDateTime; many drivers accept Instant too
time with timezone      | OffsetTime

通过另一种方式从Java传递到数据库(用作查询参数或存储)
PreparedStatement.setObject
现在也接受上述Java.time类型的对象。由于您传递的是一个类型的对象,因此在这样做时不需要单独的类型参数。

java.sql.Date等未被正式弃用(未设置弃用的javadoc标记或注释)。关于您的问题,请查找JDBC 4.2-对数据库的支持(实际上在大多数情况下不可用?),然后使用现有的方法
setObject()
getObject()
是否有可能将日期转换到下一天或前一天?我真的不想因为时区问题而改变我的生日。@Gert Jan转换
toLocalDate()
等。只需委托使用不推荐的方法,如
date.getYear()
在本地时区使用午夜(如JDBC所需和指定),请参阅源代码。如果您尝试一个由于dst更改而不存在的无效本地时间,那么您可能会观察到一些奇怪的时间向前跳(主要涉及时间和时间戳类型)。否则,转换应该是安全的,只要您有一个严格遵守规范的JDBC驱动程序,即在本地tz中解释转换。。。使用午夜?如果那天没有午夜怎么办?@Trejkaz如果由于标准时间和夏季时间之间的差距,午夜不存在,那么时间通常会根据差距的大小向前跳跃。这是旧Java和新的
Java.time
-类中的标准行为。例如:美国/圣保罗在今年10月15日不会看到午夜,因此当地最早的时间是凌晨1点。实际上,
java.time
通过调用startofDay的方法完全回避了这个问题,因此它的作用毫无疑问,而包括“午夜”在内的措辞总是让我好奇。
SQL datatype            | java.time type
------------------------+-----------------------------------------------------------
date                    | LocalDate
time                    | LocalTime
timestamp               | LocalDateTime
timestamp with timezone | Officially OffsetDateTime; many drivers accept Instant too
time with timezone      | OffsetTime