根据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
。
答案 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
没关系,但是尝试对其进行更改可能会导致问题