如何将java.util.Date转换为java.sql.Date?

问题:

我试图使用java.util.Date作为输入,然后使用它创建一个查询 – 所以我需要一个java.sql.Date
我很惊讶地发现它不能隐式或明确地进行转换 – 但是我甚至不知道我将如何做,因为Java API对我来说还是比较新的。

回答:

如果您正在尝试使用仅日期值(无时间,无时区),请使用LocalDate类而不是java.util.Date

java.time

在Java 8和更高版本中,与早期版本的Java捆绑的麻烦的旧日期时间类已被新的java.time package替代。参见Oracle Tutorial。许多功能已经在ThreeTen-Backport中回溯到Java 6和7,并进一步适应于ThreeTenABP中的Android
SQL data type DATE意为日期,没有时间,没有时区。 Java在Java 8中从未有过这样的类†直到java.time.LocalDate。我们创建一个这样的值,通过根据一个特定的时区获取今天的日期(时区在确定一个新的日期中是重要的,在巴黎早些时候比在例如蒙特利尔)。

LocalDate todayLocalDate = LocalDate.now( ZoneId.of( "America/Montreal" ) );  // Use proper "continent/region" time zone names; never use 3-4 letter codes like "EST" or "IST".

在这一点上,我们可以做到。如果您的JDBC driver符合JDBC 4.2 spec,您应该可以通过setObject setObjectPreparedStatement上传递LocalDate,以存储到SQL DATE字段中。

myPreparedStatement.setObject( 1 , localDate );

同样,使用ResultSet::getObject从SQL DATE列获取到Java LocalDate对象。在第二个参数中指定类使您的代码type-safe

LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );

换句话说,这个整个问题在JDBC 4.2中是无关紧要的或更晚。
如果您的JDBC驱动程序不以这种方式执行,则需要回退到转换为java.sql类型。

转换为java.sql.Date

要转换,使用添加到旧日期时间类的新方法。我们可以致电java.sql.Date.valueOf(…)转换LocalDate

java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );

走另一个方向。

LocalDate localDate = sqlDate.toLocalDate();

从…转换

虽然您应该避免使用旧的日期时间类,但在使用现有代码时可能会被迫使用。如果是这样,您可以转换为/从java.time转换。
通过Instant类,代表UTC时间轴上的一个时刻。 Instantjava.util.Date相似。但请注意,Instant的分辨率高达nanoseconds,而java.util.Date只有milliseconds的解决方案。
要转换,使用添加到旧类的新方法。例如,java.util.Date.from( Instant )java.util.Date::toInstant

Instant instant = myUtilDate.toInstant();

要确定一个日期,我们需要一个时区的上下文。对于任何给定的时刻,日期根据时区在全球范围内变化。申请ZoneId获得ZonedDateTime

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();

†java.sql.Date类假定是日期的,没有时间,但实际上是does一个时间,调整到午夜。混乱?是的,旧的日期时间课是一团糟。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: How to convert java.util.Date to java.sql.Date?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

− 7 = 3