![](/img/trans.png)
[英]Understanding specific UTC time format YYYY-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
。 不应该也有效吗?
这个:
Instant.parse( "-190732550-05-25T15:14:51.136Z" )
……成功是因为您输入的几亿年在 class 的 +/- 十亿年范围内。
使用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" )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.