为什么ChronoUnit.HOURS.between()不起作用?
我试图获得两个本地日期之间的时间。我使用了下面的代码:
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没有日/月/年组合可以与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,使用 2LocalDate将无法使用,HOURS因为它们没有。
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 年 4 月 30 日(未指定时间)和当前本地时间(未指定日期)之间的小时数。看到问题了吗?
你的意思大概是
从当前当地时间的今天到当天开始的2000-04-30 (或当天的其他时间)之间有多少小时?
这个计算需要两个“日期+时间”,而不是一个日期和一个时间。我们用 表示LocalDateTime。
long noOfHours = startDate.atStartOfDay().until(LocalDateTime.now(), ChronoUnit.HOURS);
注意LocalDateTime.now()and atStartOfDay,它返回LocalDateTimes。
如果您想在 2000-04-30 使用另一个时间,请使用startDate.atTime(...),或者首先创建一个LocalDateTime,例如
LocalDateTime startDate = LocalDateTime.of(2000, 4, 30, 12, 30);