Heim > Java > javaLernprogramm > 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
Freigeben: 2024-10-31 07:10:01
Original
492 Leute haben es durchsucht

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>
Nach dem Login kopieren

(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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren
  1. Um die Wanduhrdarstellung einer bestimmten Zeitzone zu erhalten:
<code class="java">ZoneId z = ZoneId.of("America/Montreal");
ZonedDateTime zdt = odt.atZoneSameInstant(z);</code>
Nach dem Login kopieren
  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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage