Java Instant';什么虫子`DateTimeException:年份的值无效`
根据,最小瞬间为Java Instant';什么虫子`DateTimeException:年份的值无效`,java,java-time,Java,Java Time,根据,最小瞬间为-100000000-01-01T00:00Z,因此年份为-100000000,时区为UTC。所以我希望这个程序能够工作,atOffset将成为一个noop: import java.time.*; 公共A类{ 公共静态void main(字符串[]args){ 瞬间i=瞬间.MIN; 系统输出打印LN(i); System.out.println(i.atOffset(ZoneOffset.UTC)); } } 但是它会在atOffset上抛出此异常: -1000000000
-100000000-01-01T00:00Z
,因此年份为-100000000
,时区为UTC
。所以我希望这个程序能够工作,atOffset
将成为一个noop:
import java.time.*;
公共A类{
公共静态void main(字符串[]args){
瞬间i=瞬间.MIN;
系统输出打印LN(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)
那是虫子吗?根据该验证的消息,最短年份为
-9999999
,但文档中说它是-100000000
atOffset
返回的最小值/最大值不同
支持的最小OffsetDateTime,'-9999999-01-01T00:00:00+18:00'
支持的最大OffsetDateTime,“+9999999-12-31T23:59:59。999999999-18:00”
javadoc提到,这些最小/最大值与最大区域偏移量一起派生,这似乎就是它们与即时不匹配的原因
根据的文档,Instant在两方面都有额外的一年
这比最短LocalDateTime早一年。这提供了足够的值来处理除本地日期时间外影响即时的区域偏移范围。该值的选择还应确保年份值符合整数
介绍LocalDateTime+偏移量产生上一年时间的边缘情况
最大实际值是转换为瞬间的最小OffsetDateTime,因为该日期之前的所有内容都是缓冲区,没有等效的OffsetDateTime。这不是错误,实际上是调用
i.atOffset(ZoneOffset.UTC)
触发创建一个OffsetDateTime
对象,该对象清楚地说明以下内容
支持的最小OffsetDateTime,'-9999999-01-01T00:00:00+18:00'
因此,基本上,如果你保持它是一个
即时的
,它是可以的,但是试图改变它可能会导致一个问题不,它不是一个bug。您正在转换为OffsetDateTime,它具有不同的最小值和最大值。读这本书,自己看看。