如何从 java.sql.Date 转换为 ZonedDateTime

How to convert from java.sql.Date to 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

有没有办法进行这种转换?

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

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

tl;博士

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

详情

不要将旧的日期时间 class 与 java.time 混用。避免使用旧的 classes。所以您拨打 java.util.Date 没有帮助。

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

所以当你必须使用java.sql.Date时,将其值转换为LocalDateLocalDate class 表示没有时间和时区的仅日期值。

要转换 to/from java.time,请查看添加到旧 classes 的新方法。

LocalDate ld = myJavaSqlDate.toLocalDate();

走向另一个方向。

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

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

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

关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

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

从哪里获得java.time classes?

  • Java SE 8, Java SE 9,及以后
    • 内置。
    • 标准 Java API 的一部分,带有捆绑实施。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6 and Java SE 7
  • Android
    • Android java.time classes.
    • 捆绑实施的更高版本
    • 对于较早的 Android (<26),ThreeTenABP project adapts ThreeTen-Backport (mentioned above). See

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.