繁体   English   中英

为什么“-190732550-MM-ddTHH:mm:ss.SSSZ”日期时间不会解析失败

[英]Why "-190732550-MM-ddTHH:mm:ss.SSSZ" datetime does not fail to parse

考虑以下片段:

String dateTimeStr = "-190732550-05-25T15:14:51.136Z";
ZonedDateTime dateTime = ZonedDateTime.parse(dateTimeStr).withZoneSameInstant(ZoneOffset.UTC);

log.info("String: {}", dateTimeStr);
log.info("ZonedDateTime: {}", dateTime);
log.info("EpochMilli: {}", dateTime.toInstant().toEpochMilli());

Output:

String: -190732550-05-25T15:14:51.136Z
ZonedDateTime: -190732550-05-25T15:14:51.136Z
EpochMilli: -6019000079877908864

我预计上面会抛出java.time.format.DateTimeParseException

编辑

"190732550-05-25T15:14:51.136Z"抛出java.time.format.DateTimeParseException 不应该也有效吗?

tl;博士

这个:

Instant.parse( "-190732550-05-25T15:14:51.136Z" )

……成功是因为您输入的几亿年在 class 的 +/- 十亿年范围内。

-1,000,000,000 < -190,732,550 < +1,000,000,000

使用Instant class 解析以Z结尾的输入字符串,这意味着与 UTC 的零小时-分钟-秒的偏移量。 不涉及时区,因此不需要ZonedDateTime

Instant instant = Instant.parse( "-190732550-05-25T15:14:51.136Z" ) ;

这个输入确实会被成功解析。 您提供的年份位于该数据类型的可能值范围内。

Instant的最小值在预定义常量Instant.MIN中表示。 引用 Javadoc:

支持的最小 Instant,'-1000000000-01-01T00:00Z'。

即年-1,000,000,000(十亿)。

你输入的年份只有-190,732,550(亿)。 因此,您的价值在 +/- 十亿年的可接受范围内。

Instant class 目前被实现为一对 64 位long整数。 一个是自 1970 UTC 的第一时刻以来的整秒数。 另一个是小数秒中的纳秒计数。 所以这个 class 能够支持广泛的值。

积极性

请注意,超过四位数字的正数年份必须在前面加上一个加号字符。

为名为ISO_LOCAL_DATE的预定义常量DateTimeFormatter引用 Javadoc,它由ISO_LOCAL_DATE_TIME使用,由ISO_OFFSET_DATE_TIME使用,在调用Instant.parse时由ISO_INSTANT使用(强调我的):

年份的四位数或更多。 0000 到 9999 范围内的年份将预先填充零以确保为四位数。 超出该范围的年份将带有前缀正号或负号。

这成功了:

Instant.parse( "+190732550-05-25T15:14:51.136Z" ) 

…而这失败了:

Instant.parse( "190732550-05-25T15:14:51.136Z" ) 

请参阅在 IdeOne.com 上实时运行的代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM