考慮以下代碼段:
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());
輸出:
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
。不應該也有效嗎?
uj5u.com熱心網友回復:
tl;博士
這:
Instant.parse( "-190732550-05-25T15:14:51.136Z" )
……成功是因為您輸入的幾億年在該類別中的 /- 十億年范圍內。
-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:
支持的最低即時值,'-1000000000-01-01T00:00Z'。
即年-1,000,000,000(十億)。
你輸入的年份只有-190,732,550(億)。因此,您的價值符合 /- 10 億年的可接受范圍。
該類Instant
當前實作為一對 64 位long
整數。一個是自 1970 UTC 第一時刻以來的整秒數。另一個是小數秒中的納秒計數。所以這個類能夠支持廣泛的值。
積極性
請注意,超過四位數的正數年份必須在前面加上加號字符。
DateTimeFormatter
為名為的預定義常量參考 Javadoc,該常量ISO_LOCAL_DATE
由ISO_LOCAL_DATE_TIME
使用,由ISO_OFFSET_DATE_TIME
使用,ISO_INSTANT
在呼叫時由 使用Instant.parse
(強調我的):
一年四位數或更多。0000 到 9999 范圍內的年份將預填充零以確保四位數。超出該范圍的年份將帶有前綴正號或負號。
這成功了:
Instant.parse( " 190732550-05-25T15:14:51.136Z" )
…而這失敗了:
Instant.parse( "190732550-05-25T15:14:51.136Z" )
請參閱在 IdeOne.com 上實時運行的代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/459846.html
標籤:爪哇 约会时间 日期时间格式 分区日期时间 java-17
上一篇:為列中的每個值添加 1天