【问题标题】:Getting Duration using the new dateTime API使用新的 dateTime API 获取 Duration
【发布时间】:2014-10-19 18:53:01
【问题描述】:

我想获得一个代表 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,在运行时抛出以下异常:

线程“主”java.time.temporal.UnsupportedTemporalTypeException 中的异常:单元不能有估计的持续时间 在 java.time.Duration.plus(未知来源) 在 java.time.Duration.of(未知来源) 在 mod7.vehicalc.Test.main(Test.java:26)

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

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

【问题讨论】:

  • 你所说的就是预期的概念是没有意义的。 3年没有已知的天数。看起来新界面正试图阻止你犯你称之为“按预期工作”的错误
  • 你应该改用句号。
  • @assylias 我一开始也是这么想的,但Period 不是有“重复”的意思吗?

标签: java datetime java-8 java-time


【解决方案1】:

Duration 是基于时间的时间量。

Period 是基于日期的时间量。

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

Period p = Period.ofYears(3);

ChronoUnit 上的估计持续时间方法主要用于对单元进行排序,即。可以说一年一般比一个月长。它并非旨在作为数学计算的基础或创建更大的Duration。特别是,如果您使用Period,那么除了LocalDateZonedDateTime 将得到正确答案。如果您使用Duration,那么您可能会得到意外/错误的答案。

【讨论】:

  • "Given that years are clearly date-based and not time-based" 并没有你想的那么清晰
【解决方案2】:

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

ChronoUnit#getDuration() 状态的 javadoc

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

YEARS是一个

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

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

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

此类以秒为单位模拟时间量或时间量 和纳秒。可以使用其他基于持续时间的单位访问它, 例如分钟和小时。此外,还可以使用 DAYS 单位和 被视为正好等于 24 小时,因此忽略日光 储蓄效应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多