为什么 ChronoUnit.HOURS.between() 不起作用?

Why ChronoUnit.HOURS.between() is NOT working?

我试图获取两个本地日期之间的时间。我使用了下面的代码:

 LocalDate startDate =  LocalDate.of(2000, 4, 30);

    long noOfHours = startDate.until(LocalTime.now(), ChronoUnit.HOURS);
    
    System.out.println(noOfHours);

我遇到以下错误:

Exception in thread "main" java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: 13:44:53.095819600 of type java.time.LocalTime
    at java.base/java.time.LocalDate.from(LocalDate.java:397)
    at java.base/java.time.LocalDate.until(LocalDate.java:1645)
    at BirthDay.App.main(App.java:36)

错误 1

如例外情况所述:您需要连贯的边界值,LocalTime 没有 day/month/year 可与 LocalDate

进行比较的成分
LocalDate startDate = LocalDate.of(2000, 4, 30);
long noOfHours = startDate.until(LocalTime.now(), ChronoUnit.HOURS);
// >> DateTimeException: Unable to obtain LocalDate from java.time.LocalTime

错误 2

此外,您还需要具有 ChronoUnit 所需单位的合成物,使用 2 LocalDate 不适用于 HOURS,因为它们具有 none。

LocalDate startDate = LocalDate.of(2000, 4, 30);
long noOfHours = startDate.until(LocalDate.now(), ChronoUnit.HOURS);
// >> UnsupportedTemporalTypeException: Unsupported unit: Hours

为此使用LocalDateTime,使单位时间的两个边界保持一致

LocalDateTime startDate = LocalDateTime.of(2000, 4, 30, 0, 0, 0);
long noOfHours = startDate.until(LocalDateTime.now(), ChronoUnit.HOURS);
System.out.println(noOfHours); // 185793

注意 LocalDate 没有时间部分,LocalTime 没有日期部分。因此,您的代码试图计算 2000-04-30(未指定时间)与当前本地时间(未指定日期)之间的小时数。看到问题了吗?

你的意思可能是,

How many hours are there, between today at the current local time, and 2000-04-30 at the start of that day (or some other time that day)?

这个计算需要两个“日期+时间”,而不是一个日期和一个时间。我们用 LocalDateTime.

表示
long noOfHours = startDate.atStartOfDay().until(LocalDateTime.now(), ChronoUnit.HOURS);

注意 LocalDateTime.now()atStartOfDay,其中 returns LocalDateTimes.

如果您想在 2000-04-30 使用另一个时间,请使用 startDate.atTime(...),或者首先创建一个 LocalDateTime,例如

LocalDateTime startDate =  LocalDateTime.of(2000, 4, 30, 12, 30);