ホームページ  >  記事  >  Java  >  Java 8 の OffsetDateTime クラスが「0000」のようなオフセットを持つ ISO 8601 文字列の解析に苦労しているのはなぜですか?

Java 8 の OffsetDateTime クラスが「0000」のようなオフセットを持つ ISO 8601 文字列の解析に苦労しているのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-31 07:10:01386ブラウズ

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 クラスと事前定義された形式パターンを使用すると、オフセットにコロンが欠落しているため、ユーザーは解析エラーが発生する可能性があります。

< h2>犯人: Java 8 Bug

この解析の問題は、OffsetDateTime クラスが時間と分の間にコロンのないオフセットを正しく解析できない Java 8 のバグに起因します。このバグは、「 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:

特定のパターンを使用して 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 の値については、インスタントを使用してください:
<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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。