Java Instant的错误? `DateTimeException:年份的无效值`

时间:2019-02-26 20:51:58

标签: java java-time

根据documentation for Instant,最小Instant是-1000000000-01-01T00:00Z,因此年份是-1000000000,时区是UTC。因此我希望该程序能够正常工作,并且atOffset不会出现问题:

import java.time.*;

public class A {
   public static void main(String[] args) {
      Instant i = Instant.MIN;
      System.out.println(i);
      System.out.println(i.atOffset(ZoneOffset.UTC));
   }
}

但是相反,它在atOffset上引发了此异常:

-1000000000-01-01T00:00:00Z
Exception in thread "main" java.time.DateTimeException: Invalid value for Year (valid values -999999999 - 999999999): -1000000000
        at java.time.temporal.ValueRange.checkValidIntValue(ValueRange.java:330)
        at java.time.temporal.ChronoField.checkValidIntValue(ChronoField.java:722)
        at java.time.LocalDate.ofEpochDay(LocalDate.java:341)
        at java.time.LocalDateTime.ofEpochSecond(LocalDateTime.java:422)
        at java.time.OffsetDateTime.ofInstant(OffsetDateTime.java:328)
        at java.time.Instant.atOffset(Instant.java:1195)
        at A.main(A.java:7)

这是一个错误吗?根据该验证的消息,最小年份为-999999999,但文档显示为最小年份-1000000000

2 个答案:

答案 0 :(得分:5)

atOffset返回的OffsetDateTime具有不同的最小/最大。

  

支持的最小OffsetDateTime为'-999999999-01-01T00:00:00 + 18:00'。

     

支持的最大OffsetDateTime为'+ 999999999-12-31T23:59:59.999999999-18:00'。

javadoc提到这些最小值/最大值与最大区域偏移量一起从LocalDateTime派生而来,这似乎就是为什么它们不匹配Instant的原因。

根据Instant的文档,Instant双向都有额外一年的原因。

  

这比最小LocalDateTime早一年。除了提供本地日期时间之外,这还提供了足够的值来处理影响时间的ZoneOffset范围。还选择了该值,以使年份的值适合一个整数。

涵盖极端情况,即LocalDateTime + Offset导致上一年的时间。

最大实际值是转换为Instant的最小OffsetDateTime,因为该日期之前的所有内容都是没有等效OffsetDateTime的缓冲区。

答案 1 :(得分:2)

这不是错误,实际上是调用的动作

i.atOffset(ZoneOffset.UTC)

触发创建javadoc明确声明以下内容的OffsetDateTime对象

  

支持的最小OffsetDateTime为'-999999999-01-01T00:00:00 + 18:00'。

因此,基本上,如果您将其保留为Instant没关系,但是尝试对其进行更改可能会导致问题