计算 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();
我正在尝试计算两个 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
:
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();