ChronoUnit.between()用于转换的java.util.Date

时间:2016-10-27 13:07:20

标签: java date time

这有效(返回0):

ChronoUnit.SECONDS.between(
        LocalDateTime.now(),
        LocalDateTime.now());

这失败了:

ChronoUnit.SECONDS.between(
        ZonedDateTime.ofInstant(new Date().toInstant(), ZoneId.of("UTC"),
        LocalDateTime.now());

有这个例外:

Exception in thread "main" java.time.DateTimeException: Unable to obtain ZonedDateTime from TemporalAccessor: 2016-10-27T14:05:37.617 of type java.time.LocalDateTime
...
Caused by: java.time.DateTimeException: Unable to obtain ZoneId from TemporalAccessor: 2016-10-27T14:05:37.617 of type java.time.LocalDateTime
at java.time.ZoneId.from(ZoneId.java:466)
at java.time.ZonedDateTime.from(ZonedDateTime.java:553)
... 3 more

有没有人知道如何在ChronoUnit.between()中使用java.util.Date?

2 个答案:

答案 0 :(得分:3)

ChronoUnit.between方法的文档说:

  

计算此单位的金额。起点和终点作为临时对象提供,并且必须是兼容类型。在计算金额之前,实现将第二种类型转换为第一种类型的实例。

它正在尝试将LocalDateTime转换为ZonedDateTimeLocalDateTime没有区域信息并导致错误。

如果您使用ZonedDateTime作为第二个参数,它可以正常工作:

ChronoUnit.SECONDS.between(ZonedDateTime.ofInstant(new Date().toInstant(), ZoneId.of("UTC")), ZonedDateTime.now())

答案 1 :(得分:3)

LocalDateTime没有时区。没有办法将它与Instant或ZonedDateTime进行比较,它们代表了确切的时间点。

由于您的问题是关于比较日期,最简单的方法是将Instant与Instant比较:

long seconds = ChronoUnit.SECONDS.between(
    new Date().toInstant(),
    Instant.now());