使用新的dateTime API获取持续时间

时间:2014-10-19 18:53:02

标签: java datetime java-8 java-time

我希望得到一个代表3年持续时间的java.time.Duration实例,
我发现了两种方法(见下面的代码)。

public static void main(String[] args) {
    Duration d1 = Duration.of(3, ChronoUnit.YEARS); //Runtime Exception
    Duration d2 = ChronoUnit.YEARS.getDuration().multipliedBy(3);

    System.out.println("d2="+d2.toDays()); //OUTPUT: d2=1095
}

第一种方式d1在运行时抛出以下异常:

Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unit must not have an estimated duration
    at java.time.Duration.plus(Unknown Source)
    at java.time.Duration.of(Unknown Source)
    at mod7.vehicalc.Test.main(Test.java:26)

第二种方式d2按预期工作。

造成这种差异的原因是什么?

2 个答案:

答案 0 :(得分:12)

Duration是基于时间的时间量。

Period是基于日期的时间量。

鉴于年份明显基于日期而非基于时间,您需要使用Period。 (Period)没有“复发”方面。

Period p = Period.ofYears(3);

ChronoUnit上的估计持续时间方法主要用于排序单位,即。可以说一年通常超过一个月。它不是数学计算的基础或创建更大的Duration。特别是,如果您使用Period,那么添加到LocalDateZonedDateTime将会得到正确的答案。如果您使用Duration,那么您可能会得到意外/错误的答案。

答案 1 :(得分:1)

  

造成这种差异的原因是什么?

ChronoUnit#getDuration()州的javadoc

  

获取ISO日历系统中此单位的估计持续时间。

也就是说,YEARS

  

代表一年概念的单位。对于ISO日历   系统,相当于12个月。估计一年的持续时间是   365.2425天。

或31556952秒。这只是一个估计。

Duration.of(..)期望一个单位具有确切的时间价值。

  

此课程以秒为单位模拟一定数量或时间   和纳秒。它可以使用其他基于持续时间的单位访问,   如分钟和小时。此外,可以使用DAYS单元   被视为完全等于24小时,因此忽略了日光   储蓄效应。