java.time.Instant - 解析大日期时出错

Sog*_*sps 1 java java-time java.time.instant

我试图使用 Instant.parse 方法解析一个非常大的日期(但仍然小于 Instant.MAX),但出现错误。

String input = "78000000-01-01T00:00:00Z";
Instant instant = Instant.parse(input);
Run Code Online (Sandbox Code Playgroud)

例外:

Exception in thread "main" java.time.format.DateTimeParseException: Text '78000000-01-01T00:00:00Z' could not be parsed at index 0
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2106)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:2008)
at java.base/java.time.Instant.parse(Instant.java:399)
Run Code Online (Sandbox Code Playgroud)

BC 日期“-78000000-01-01T00:00:00Z”已解析正常。

我是否发现了 Java 中的错误:)?

use*_*675 10

功能,而不是错误

\n

不,这不是错误 - 正在按指定方式工作!

\n

来自文档parse():​

\n
\n

使用DateTimeFormatter.ISO_INSTANT进行解析

\n
\n

和来自ISO_INSTANT

\n
\n

返回一个不可变的格式化程序,能够格式化和解析 ISO-8601 即时格式

\n
\n

ISO_INSTANT指的ISO_OFFSET_DATE_TIME是ISO_LOCAL_DATE_TIME到ISO_LOCAL_DATE。最后一篇说:

\n
\n
    \n
  • 年份的四位数或更多。0000 到 9999 范围内的年份
    \n将预先填充零以确保四位数字。\n该范围之外的年份
    将具有前缀正数或负数符号。
  • \n
\n
\n

这意味着要解析的年份也必须遵守上述格式。

\n

最后,来自维基百科的 ISO-8601(年):

\n
\n

为了表示 0000 之前或 9999 之后的年份,该标准还允许扩展年份表示形式...。扩展的年份表示形式 [\xc2\xb1YYYYY] 必须具有超出四位数最小值的商定数量的额外年份数字,并且必须以 + 或 \xe2\x88\x92 符号作为前缀。

\n
\n

强调我的

\n
\n

输入字符串"78000000-01-01T00:00:00Z"缺少该+符号,但"-78000000-01-01T00:00:00Z"正确地以符号开头-。

\n

输入"+78000000-01-01T00:00:00Z"被解析,没有错误。

\n
\n

提示:您可以在解析之前通过格式化测试日期/时间/...来检查格式。
\n例如:

\n
var test = Instant.from(OffsetDateTime.of(78000000, 1, 1, 0, 0, 0, 0,ZoneOffset.UTC));\nSystem.out.println(test.toString());  // or using any relevant formatter\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
\n

+78000000-01-01T00:00:00Z

\n
\n