3

我正在尝试计算两个 LocalDates 之间的秒数。现在这实际上让我很难过,因为这个代码片段运行得不太好:

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

这给了我一个例外:

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

我真的无法在互联网上找到任何其他方法来做到这一点。如果你能帮助我,那就太好了!

提前致谢

4

3 回答 3

2

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

总结:

这没有任何意义,因为日历日期对小时、分钟或秒一无所知。支持的最低单位必须是天。另请参阅Java-8-class的APILocalDate

如果单位是 ChronoUnit,则在此处实现查询。支持的单位是: •DAYS •WEEKS •MONTHS •YEARS •DECADES •CENTURIES •MILLENNIA •ERAS 所有其他ChronoUnit 实例将返回false。

原因:

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

日期 + 86400 秒 = 下一个日期

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

对比课堂上一天更精确的单位的支持LocalDate会导致无法治愈的不一致。

于 2016-12-01T15:00:12.977 回答
2

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(); 
于 2016-12-01T15:14:20.330 回答
1

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

这没有任何意义,因为日历日期对小时、分钟或秒一无所知。支持的最低单位必须是天。

——梅诺·霍克希尔德

这几乎是切中要害。

非常感谢,梅诺霍奇柴尔德

于 2016-12-01T14:44:28.240 回答