首頁 >Java >java教程 >為什麼 Java 8 的 OffsetDateTime 類別很難解析帶有「0000」這樣的偏移量的 ISO 8601 字串?

為什麼 Java 8 的 OffsetDateTime 類別很難解析帶有「0000」這樣的偏移量的 ISO 8601 字串?

Barbara Streisand
Barbara Streisand原創
2024-10-31 07:10:01489瀏覽

Why is Java 8's OffsetDateTime class struggling to parse ISO 8601 strings with offsets like

使用Java 8 Date API 解析ISO 8601 字串的困難

嘗試解析ISO 8601 格式的字串時(「2018- 02-13T10:20:12.120 0000") 使用Java 8 的ZonedDateTime 類別和預先定義的格式模式,使用者可能會因偏移量中缺少冒號而遇到解析錯誤。

罪魁禍首:Java 8 Bug

此解析問題源自於Java 8 中的一個Bug,該Bug 阻止OffsetDateTime 類別正確解析小時和分鐘之間沒有正確解析小時和分鐘之間沒有冒號的偏移量。此錯誤會影響“0000”等偏移量,但不會影響“00:00”。

修正該錯誤之前的解決方法:

(a ) 字串操作駭客:

在解析先前更改輸入字串以添加缺少的冒號:

<code class="java">String input = "2018-02-13T10:20:12.120+0000".replace("+0000", "+00:00");
OffsetDateTime odt = OffsetDateTime.parse(input);</code>

(b) 明確DateTimeFormatter: h3>

使用特定模式定義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)。

附加說明:

  1. 對於UTC 值,請使用Instant:
<code class="java">Instant instant = odt.toInstant();</code>
  1. 要取得特定時區的掛鐘表示:
<code class="java">ZoneId z = ZoneId.of("America/Montreal");
ZonedDateTime zdt = odt.atZoneSameInstant(z);</code>
  1. 避免遺留日期時間類;請改用java.time。

以上是為什麼 Java 8 的 OffsetDateTime 類別很難解析帶有「0000」這樣的偏移量的 ISO 8601 字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn