使用新的日期时间 API 获取持续时间

2022-09-03 18:08:12

我想得到一个表示3年持续时间的java.time.Duration实例,
我发现了2种方法(请参阅下面的代码)。

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

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


答案 1

A 是基于时间的时间量。Duration

A 是基于日期的时间量。Period

鉴于年份显然是基于日期的,而不是基于时间的,因此您需要使用 。(没有“重复”方面)。PeriodPeriod

Period p = Period.ofYears(3);

估计持续时间的方法主要是为了对单元进行排序,即。能够说一年通常比一个月长。它不打算成为数学计算或创建更大的.特别是,如果您使用 then 添加到 or 中将产生正确答案。如果您使用a,则可能会得到意外/错误的答案。ChronoUnitDurationPeriodLocalDateZonedDateTimeDuration


答案 2

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

The javadoc for ChronoUnit#getDuration() state

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

也就是说,岁月是一个

表示一年概念的单位。对于 ISO 日历系统,它等于 12 个月。一年的估计持续时间为365.2425天。

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

持续时间(..)需要具有精确时间值的单位。

此类以秒和纳秒为单位对时间量或量进行建模。可以使用其他基于持续时间的单位(如分钟和小时)访问它。此外,可以使用 DAYS 单位,并被视为完全等于 24 小时,从而忽略夏令时效应。