Heim  >  Artikel  >  Java  >  Warum hat die OffsetDateTime-Klasse von Java 8 Schwierigkeiten, ISO 8601-Zeichenfolgen mit Offsets wie „0000“ zu analysieren?

Warum hat die OffsetDateTime-Klasse von Java 8 Schwierigkeiten, ISO 8601-Zeichenfolgen mit Offsets wie „0000“ zu analysieren?

Barbara Streisand
Barbara StreisandOriginal
2024-10-31 07:10:01386Durchsuche

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

Schwierigkeiten beim Parsen von ISO 8601-Zeichenfolgen mit der Java 8-Datums-API

Beim Versuch, eine ISO 8601-formatierte Zeichenfolge zu analysieren ("2018- 02-13T10:20:12.120 0000") unter Verwendung der ZonedDateTime-Klasse von Java 8 und eines vordefinierten Formatmusters kann es bei Benutzern aufgrund eines fehlenden Doppelpunkts im Offset zu einem Analysefehler kommen.

Der Täter : Ein Java 8-Fehler

Dieses Parsing-Problem ist auf einen Fehler in Java 8 zurückzuführen, der verhindert, dass die OffsetDateTime-Klasse Offsets ohne Doppelpunkt zwischen den Stunden und Minuten korrekt analysiert. Dieser Fehler betrifft Offsets wie „0000“, aber nicht „00:00“.

Problemumgehungen, bis der Fehler behoben ist:

(a ) String-Manipulations-Hack:

Ändern Sie die Eingabezeichenfolge, um vor dem Parsen den fehlenden Doppelpunkt hinzuzufügen:

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

(b) Explicit DateTimeFormatter:

Definieren Sie einen DateTimeFormatter mit einem bestimmten Muster, um das Parsen zu steuern:

<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>

Weitere Verbesserungen:

Weitere Informationen Anpassbares Formatierungsmuster, verwenden Sie einen 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>

Empfehlung:

Um das Parsen zu vereinfachen, stellen Sie sicher, dass Offsets immer einen Doppelpunkt enthalten, sowohl Stunden als auch Stunden Minuten (auch wenn Null) und füllen Sie Nullen auf (-05:00 statt -5).

Zusätzliche Hinweise:

  1. Für Werte in UTC verwenden Sie Instant:
<code class="java">Instant instant = odt.toInstant();</code>
  1. Um die Wanduhrdarstellung einer bestimmten Zeitzone zu erhalten:
<code class="java">ZoneId z = ZoneId.of("America/Montreal");
ZonedDateTime zdt = odt.atZoneSameInstant(z);</code>
  1. Legacy vermeiden Datum-Uhrzeit-Klassen; Verwenden Sie stattdessen java.time.

Das obige ist der detaillierte Inhalt vonWarum hat die OffsetDateTime-Klasse von Java 8 Schwierigkeiten, ISO 8601-Zeichenfolgen mit Offsets wie „0000“ zu analysieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn