【问题标题】:Calculate Seconds between two LocalDates in Java在 Java 中计算两个 LocalDates 之间的秒数
【发布时间】:2016-12-01 14:26:51
【问题描述】:

我正在尝试计算两个 LocalDates 之间的秒数。 现在这实际上让我很难过,因为这段代码 sn-p 是 效果不好:

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

这给了我一个例外:

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

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

提前致谢

【问题讨论】:

  • 能否展示lastRefreshPoint的声明和实例化?
  • 你是如何创建lastRefreshPoint的?
  • 这没有任何意义,因为日历日期不知道有关小时、分钟或秒的任何信息。支持的最低单位必须是天。

标签: java time localdate


【解决方案1】:

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

总结:

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

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

原因:

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

日期 + 86400 秒 = 下一个日期

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

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

【讨论】:

    【解决方案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(); 
    

    【讨论】:

      【解决方案3】:

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

      这没有任何意义,因为日历日期不知道 任何关于小时、分钟或秒的信息。支持的最低单位 一定是这一天。

      -- 梅诺霍赫希尔

      这几乎是重点。

      非常感谢,Meno Hochschild

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2015-01-16
      • 2011-09-04
      • 2013-12-08
      相关资源
      最近更新 更多