与课程文档相反,持续时间不支持DAYS

时间:2016-02-02 23:07:09

标签: java duration java-time

在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 );
  

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

我误解了某些内容,还是滥用了这些课程?

3 个答案:

答案 0 :(得分:6)

持续时间类get的文档。

  

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

但是,Duration类有一个名为toDays的方法:

  

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

答案 1 :(得分:3)

遗憾的是,get(TemporalUnit)方法令人困惑,并非针对大多数用户。要了解原因,请参阅this answer

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

Javadoc并非完全错误,但可能并非完全有用。该课程确实在toDays()ofDays(), plusDays()等24小时内提供了一些支持。只是get(TemporalUnit)方法被误导性地命名(应为internalGet(TemporalUnit)或一些这样的名字)。

答案 2 :(得分: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 和 纳米。所有其他单位抛出异常。

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