【问题标题】:Duration does not support DAYS contrary to class documentationDuration 不支持 DAYS 与类文档相反
【发布时间】:2016-02-02 23:07:08
【问题描述】:

在 Java 8 及更高版本的java.time 框架中,Duration 类表示:

此类以秒和纳秒为单位模拟时间量或时间量。可以使用其他基于持续时间的单位来访问它,例如分钟和小时。此外,可以使用DAYS 单位,并将其视为正好等于 24 小时,从而忽略夏令时的影响。

然而,当我调用get 方法并传递ChronoUnit.DAYS 时,会引发异常。

LocalTime start = LocalTime.of ( 0 , 0 , 0 ); // First moment of the day.
LocalTime stop = LocalTime.of ( 2 , 0 , 0 ); // 2 AM.

Duration duration = Duration.between ( start , stop );
long days = duration.get ( ChronoUnit.DAYS );

线程“主”java.time.temporal.UnsupportedTemporalTypeException 中的异常:不支持的单位:天

我是误会了什么,还是误用了类?

【问题讨论】:

  • 据我所知,在Duration.get(...) 中工作的唯一ChronoUnit 常量是SECONDSNANOS,但我从来不知道原因。
  • @f1sh 为什么?这是因为Duration 的内部状态只保存秒和纳秒。 get(TemporalField)-方法旨在根据内部状态产生 部分 数量。相比之下,toDays() 尝试确定以 1d=24h 为基数转换为天数的整数量。
  • 我之前的评论中有错字。我不想说get(TemporalField),而是说:get(TemporalUnit)

标签: java duration java-time


【解决方案1】:

关于 Duration 类的 get 的文档。

获取请求单位的值。 这将为两个支持的单位 SECONDS 和 NANOS 中的每一个返回一个值。所有其他单位都会抛出异常。

不过,Duration 类有一个名为 toDays 的方法:

获取此持续时间的天数。 这将通过将秒数除以 86400 来返回持续时间中的总天数。这是基于一天的标准定义为 24 小时。

【讨论】:

  • 那么类文档有错误,我应该提交错误报告吗?
  • @BasilBourque 我不认为这是一个错误,但可能只是稍微混淆了文档。整体类描述只是给出一个总结。我会考虑方法描述来胜过整体总结。它没有明确说明在哪里您可以使用DAYS,但如果您阅读了其他一些方法(例如minus),您可以在这些情况下使用DAYS
  • 我使用了文档报价。在我看来,当然我们应该能够获得几天。
【解决方案2】:

不幸的是,get(TemporalUnit) 方法令人困惑,不适用于大多数用户。要了解原因,请参阅this answer

Java SE 9 将包含一组更丰富的Duration 访问方法。目前,您可以使用toDays() 获取总天数。

Javadoc 并非完全错误,但也可能不是完全有帮助。该类在toDays()ofDays(), plusDays() 等中确实支持24 小时。只是get(TemporalUnit) 方法的命名非常容易误导(应该是internalGet(TemporalUnit) 或类似的名称)。

【讨论】:

    【解决方案3】:

    A.最好更换

    LocalTime start = LocalTime.of(0, 0, 0); // First moment of the day.
    

    LocalTime start = LocalTime.MIN; // First moment of the day.
    

    或与

    LocalTime start = LocalTime.MIDNIGHT; // First moment of the day.
    

    还有以下

    LocalTime stop = LocalTime.of ( 2 , 0 , 0 ); // 2 AM.
    

    可以替换为

    LocalTime stop = LocalTime.of ( 2 , 0 ); // 2 AM.
    

    B.您遇到的异常是预期行为,并且已记录在Duration

    这将为两个受支持的单位 SECONDS 和 纳米。所有其他单位都会抛出异常。

    您可以使用 Duration#getUnits 获取支持的单位列表,不幸的是它已被声明为非静态函数(因此您必须创建任意持续时间才能使用它):

    import java.time.Duration;
    
    public class Main {
        public static void main(String[] args) {
            Duration duration = Duration.ofDays(10);// An arbitrary duration
            System.out.println(duration.getUnits());
        }
    }
    

    输出:

    [Seconds, Nanos]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 2018-12-31
      相关资源
      最近更新 更多