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来自文档parse():
\n\n\n
和来自ISO_INSTANT
\n\n\n返回一个不可变的格式化程序,能够格式化和解析 ISO-8601 即时格式
\n
ISO_INSTANT指的ISO_OFFSET_DATE_TIME是ISO_LOCAL_DATE_TIME到ISO_LOCAL_DATE。最后一篇说:
\n\n\n
\n- 年份的四位数或更多。0000 到 9999 范围内的年份
\n
\n将预先填充零以确保四位数字。\n该范围之外的年份
将具有前缀正数或负数符号。
这意味着要解析的年份也必须遵守上述格式。
\n\n\n\n为了表示 0000 之前或 9999 之后的年份,该标准还允许扩展年份表示形式...。扩展的年份表示形式 [\xc2\xb1YYYYY] 必须具有超出四位数最小值的商定数量的额外年份数字,并且必须以 + 或 \xe2\x88\x92 符号作为前缀。
\n
强调我的
\n输入字符串"78000000-01-01T00:00:00Z"缺少该+符号,但"-78000000-01-01T00:00:00Z"正确地以符号开头-。
输入"+78000000-01-01T00:00:00Z"被解析,没有错误。
提示:您可以在解析之前通过格式化测试日期/时间/...来检查格式。
\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\nRun Code Online (Sandbox Code Playgroud)\n输出:
\n\n\n\n
+78000000-01-01T00:00:00Z