计算 Java 中两个 LocalDate 之间的秒数

Calculate Seconds between two LocalDates in Java

我正在尝试计算两个 LocalDate 之间的秒数。 现在这实际上让我很为难,因为这个代码片段是 效果不佳:

long seconds = lastRefreshPoint.until(systemTime, ChronoUnit.SECONDS);

这给了我例外:

java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Minutes

我真的无法在 Internet 上找到任何其他方法来执行此操作。 如果你能帮助我,那就太好了!

提前致谢

这是我自己发布的,因为这是作为评论而不是作为答案发布的:

This does not make any sense since a calendar date does not know anything about hours, minutes or seconds. The lowest supported unit must be the day.

-- Meno Hochschild

说到点子上了。

非常感谢,Meno Hochschild

好的,这里是我的评论作为答案,以及关于观察到的行为原因的一些细节。

总结:

这没有任何意义,因为日历日期不知道小时、分钟或秒的任何信息。支持的最低单位必须是天。另请参阅 Java-8-class LocalDate:

API

If the unit is a ChronoUnit then the query is implemented here. The supported units are: •DAYS •WEEKS •MONTHS •YEARS •DECADES •CENTURIES •MILLENNIA •ERAS All other ChronoUnit instances will return false.

原因:

虽然有人可以想象将两个连接日之间的秒差实现为 86400 秒(忽略区域效应或闰秒),但这不是一个好主意。如果 API 设计者决定支持中间算术,那么他们也应该决定支持向日期添加秒数。但问题从这里开始:

日期 + 86400 秒 = 下一个日期

但什么是日期 + 123 秒???

支持 class LocalDate 中比一天更精确的单位会导致无法修复的不一致。

Hochschild 的回答是正确的,应该被接受。

LocalDate::atStartOfDay

要从仅限日期的值生成日期时间值,请使用当天的第一时刻。这样做需要一个时区。对于任何给定的时刻,日期可能因地区而异。

不要假设这一天从时间 00:00:00 开始。由于夏令时等异常情况,一天可能会在 01:00:00.

等时间开始
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = myLocalDate.atStartOfDay( z );

然后继续计算经过的时间。

Duration d = Duration.of( zdtStart , zdtStop );
long seconds = d.getSeconds();