我正試圖驗證并將日期時間以任何偏移量存盤到資料庫中的UTC。
為了驗證,我正在使用
。DateTimeFormatter.ISO_ZONED_DATE_TIME.parseUnresolved(dateString, new ParsePosition(0)>。)
當呼叫偏移量為-25:00時,這將拋出java.time.DateTimeException。值超出了范圍。Hour[0-23], Minute[0-59], Second[0-59]。對于任何其他無效的字串,這將回傳null。
但是當我試圖用
來決議它時ZonedDateTime.parse(dateString)
當使用正確的偏移量為-23:00時,這將拋出文本'2012-04-23T18:25:43.511-23:00'無法被決議。區域偏移不在有效范圍內:-18:00到 18:00。如果我查一下方法的定義,似乎它使用的是同一個決議方法DateTimeFormatter.ISO_ZONED_DATE_TIME
public static ZonedDateTime parse(charSequence text) {
return parse(text, DateTimeFormatter.ISO_ZONED_DATE_TIME) 。
}
我的問題是,為什么在決議ISO 8601日期時間時有不同的偏移量限制?
uj5u.com熱心網友回復:
檔案在這里描述了這個區別:
決議是作為一個兩階段的操作來實作的。首先,使用由格式化器定義的布局來決議文本,產生一個欄位到值的地圖、一個ZoneId和一個Chronology。其次,通過驗證、組合和簡化各種欄位,將決議后的資料決議為更有用的欄位。
該類提供了五個決議方法。其中四個方法同時執行決議和解決階段。第五種方法,
parseUnresolved(CharSequence, ParsePosition),只執行第一階段,留下未解決的結果。因此,它本質上是一個低級別的操作。
因此,parseUnresolved不做的事情,而parse做的事情,是 "驗證[...]各個欄位"。在這種情況下,parse檢查偏移量是否在ChronoField.OFFSET_SECONDS.range()(±18小時)之內。parseUnresolved并沒有這樣做,就像它沒有檢查20號月是否是一個有效的月份一樣:
System.out.println(
//這回傳一個非空值。
DateTimeFormatter.ISO_LOCAL_DATE.parseUnresolved(
"2021-20-20", new ParsePosition(0)
)
);
DateTimeException也是檔案化的例外,parseUnresolved可以拋出。
拋出:
DateTimeException- 如果在決議程序中出現了一些問題
碰巧的是,parseUnresolved在決議偏移量的時候,在 "第一階段",并沒有識別出超過24小時的東西是偏移量。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/312017.html
標籤:
