嘗試解析ISO 8601 格式的字串時(「2018- 02-13T10:20:12.120 0000") 使用Java 8 的ZonedDateTime 類別和預先定義的格式模式,使用者可能會因偏移量中缺少冒號而遇到解析錯誤。
此解析問題源自於Java 8 中的一個Bug,該Bug 阻止OffsetDateTime 類別正確解析小時和分鐘之間沒有正確解析小時和分鐘之間沒有冒號的偏移量。此錯誤會影響“0000”等偏移量,但不會影響“00:00”。
在解析先前更改輸入字串以添加缺少的冒號:
<code class="java">String input = "2018-02-13T10:20:12.120+0000".replace("+0000", "+00:00"); OffsetDateTime odt = OffsetDateTime.parse(input);</code>
使用特定模式定義DateTimeFormatter 來指導解析:
<code class="java">String input = "2018-02-13T10:20:12.120+0000"; DateTimeFormatter f = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSX"); OffsetDateTime odt = OffsetDateTime.parse(input, f);</code>
更多適應性格式化模式,使用DateTimeFormatterBuilder:
<code class="java">DateTimeFormatter f = DateTimeFormatterBuilder.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSX") .appendOffset("+HH:MM", "Z") .toFormatter(); OffsetDateTime odt = OffsetDateTime.parse(input, f);</code>
為了簡化解析,請確保偏移量始終包含冒號,包括小時和分鐘(即使為零),並使用填充零(-05:00 而不是-5)。
<code class="java">Instant instant = odt.toInstant();</code>
<code class="java">ZoneId z = ZoneId.of("America/Montreal"); ZonedDateTime zdt = odt.atZoneSameInstant(z);</code>
以上是為什麼 Java 8 的 OffsetDateTime 類別很難解析帶有「0000」這樣的偏移量的 ISO 8601 字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!