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

g7k*_*g7k 9 java datetime java-8 java-time

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

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
}
Run Code Online (Sandbox Code Playgroud)

第一种方法是,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按预期工作.

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

Jod*_*hen 15

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

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

鉴于这些年份显然是基于日期而不是基于时间的,您需要使用Period.(没有"复发"方面Period).

Period p = Period.ofYears(3);
Run Code Online (Sandbox Code Playgroud)

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

  • “鉴于年份显然是基于日期而不是基于时间”,这并不像您想象的那么清晰 (6认同)

Sot*_*lis 8

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

ChronoUnit#getDuration()各州的 javadoc

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

也就是说,YEARS是一个

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

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

Duration.of(..)需要一个具有精确时间值的单位。

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