ISO 8601 形式の文字列を解析しようとした場合("2018-02-13T10:20:12.120 0000") Java 8 の ZonedDateTime クラスと事前定義された形式パターンを使用すると、オフセットにコロンが欠落しているため、ユーザーは解析エラーが発生する可能性があります。
< h2>犯人: Java 8 Bug
この解析の問題は、OffsetDateTime クラスが時間と分の間にコロンのないオフセットを正しく解析できない Java 8 のバグに起因します。このバグは、「 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 中国語 Web サイトの他の関連記事を参照してください。