如何转换java.sql.Date到ZonedDateTime

时间:2016-09-29 19:50:49

标签: mysql spring zoneddatetime

我正在尝试从java.sql.Date转换为ZonedDateTime。这是我正在使用的代码

ZonedDateTime.from(new java.util.Date(result.get(0).getTime()).toInstant())

但是,它会导致以下错误 -

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.time.DateTimeException: Unable to obtain LocalDateTime from TemporalAccessor: 2016-09-29T18:30:00Z of type java.time.Instant

有没有办法进行此转换?

2 个答案:

答案 0 :(得分:9)

TL;博士

ZonedDateTime zdt =
    myJavaSqlDate.toLocalDate()
                 .atStartOfDay( ZoneId.of( "America/Montreal" ) ) ;

详细

不要将旧的日期时间类与java.time混合使用。避免旧班。因此,您拨打java.util.Date的电话无效。

知道java.sql.Date代表一个仅限日期的值,没有时间和没有时区。不幸的是,它确实有一个时间和一个时区,但我们应该忽略这些事实。这是一个设计糟糕的课程。仅当您还没有支持JDBC 4.2和java.time类型的JDBC驱动程序时才使用它。

因此,当您必须使用java.sql.Date将其值转换为LocalDate时。 LocalDate类表示没有时间且没有时区的仅限日期的值。

要转换为/从java.time,请查看添加到旧类的新方法。

LocalDate ld = myJavaSqlDate.toLocalDate();

走向另一个方向。

java.sql.Date myJavaSqlDate = java.sql.Date.valueOf( ld );

如果您的目标是从仅限日期的值获取日期时间值,则需要指定一个时间。如果你想要一天的第一时刻,让java.time为你确定那个时间。由于夏令时(DST)等异常,时间00:00:00 始终是一天的开始。处理此类异常需要您指定时区,因为每个区域都有自己的异常规则。因此,应用ZoneId来获取ZonedDateTime对象。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ld.atStartOfDay( z );

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:2)

您所能做的就是更改为本地日期时间,时间设置为当天开始,因为java sql date没有时间组件。使用时区或默认为系统时区来获取分区日期时间

ZonedDateTime zonedDateTime = ZonedDateTime.of(result.get(0).toLocalDate().atStartOfDay(), ZoneId.systemDefault());