使用新的dateTime API获取持续时间
我想得到一个代表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:
线程“main”中的exceptionjava.time.temporal.UnsupportedTemporalTypeException:Unit不能有估计的持续时间 在java.time.Duration.plus(未知来源) 在java.time.Duration.of(未知来源) 在mod7.vehicalc.Test.main(Test.java:26)
第二种方式, d2
,按预期工作。
造成这种差异的原因是什么?
Duration
是基于Duration
的时间量。
Period
是基于日期的时间量。
鉴于这些年份显然是基于日期的而不是基于时间的,您需要使用Period
。 ( Period
没有“复发”方面)。
Period p = Period.ofYears(3);
ChronoUnit
上的估计持续时间方法主要用于排序单位,即。 可以说一年通常超过一个月。 它不是数学计算的基础或创建更大的Duration
。 特别是,如果您使用Period
则添加到LocalDate
或ZonedDateTime
将得到正确的答案。 如果您使用Duration
那么您可能会得到意外/错误的答案。
造成这种差异的原因是什么?
ChronoUnit#getDuration()
的javadoc说明
获取ISO日历系统中此单元的估计持续时间。
也就是说, YEARS
是一个
代表一年概念的单位。 对于ISO日历系统,它等于12个月。 估计一年的持续时间为365.2425天。
或者31556952秒。 这只是一个估计。
Duration.of(..)
期望一个单位具有确切的时间价值。
此类以秒和纳秒为单位模拟时间量或时间量。 可以使用其他基于持续时间的单位访问它,例如分钟和小时。 此外,DAYS单元可以使用,并且被视为完全等于24小时,因此忽略了夏令时效果。