我正在尝试从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
有没有办法进行此转换?
答案 0 :(得分:9)
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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance 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的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 1 :(得分:2)
您所能做的就是更改为本地日期时间,时间设置为当天开始,因为java sql date没有时间组件。使用时区或默认为系统时区来获取分区日期时间
ZonedDateTime zonedDateTime = ZonedDateTime.of(result.get(0).toLocalDate().atStartOfDay(), ZoneId.systemDefault());