持续时间不支持天数,与类文档相反。

8
在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”常量是“SECONDS”和“NANOS”,但我从未弄清原因。 - f1sh
1
@f1sh为什么?这是因为Duration的内部状态只包含秒和纳秒。get(TemporalField)方法旨在根据内部状态产生部分数量。相比之下,toDays()试图确定以1d=24h为基础转换为整个天数的数量。 - Meno Hochschild
我在之前的评论中打错了字。我想说的是:而不是说get(TemporalField),我想说的是get(TemporalUnit) - Meno Hochschild
3个回答

6

Duration类中get方法的文档。

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

然而,Duration类有一个名为toDays的方法:

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


那么类的文档有误,我应该提交一个错误报告? - Basil Bourque
@BasilBourque 我认为这不是一个错误,而只是有点令人困惑的文档。整个类描述只是给出了一个概述。我认为方法描述比总体摘要更重要。它没有明确说明您可以在哪里使用“DAYS”,但如果您阅读其他一些方法(如“minus”),则可以在这些情况下使用“DAYS”。 - kunruh
我扩展了文档引用。看起来我们应该能够得到一些天数。 - Basil Bourque

4
get(TemporalUnit)方法令人困惑,不适用于大多数用户。要了解原因,请参见此答案
Java SE 9将包括更丰富的Duration访问方法集。目前,您可以使用toDays()获取总天数。
Javadoc并没有错,但也许不是非常有帮助。该类确实支持24小时内的天数,例如toDays(), ofDays(), plusDays()等。只是get(TemporalUnit)方法的命名非常具有误导性(应该命名为internalGet(TemporalUnit)或类似名称)。

0

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和NANOS,其他单位会抛出异常。

你可以使用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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接