Maison > Java > javaDidacticiel > Pourquoi la classe OffsetDateTime de Java 8 a-t-elle du mal à analyser les chaînes ISO 8601 avec des décalages tels que « 0000 » ?

Pourquoi la classe OffsetDateTime de Java 8 a-t-elle du mal à analyser les chaînes ISO 8601 avec des décalages tels que « 0000 » ?

Barbara Streisand
Libérer: 2024-10-31 07:10:01
original
580 Les gens l'ont consulté

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

Difficultés à analyser les chaînes ISO 8601 avec l'API de date Java 8

Lors de la tentative d'analyse d'une chaîne au format ISO 8601 ("2018- 02-13T10:20:12.120 0000") en utilisant la classe ZonedDateTime de Java 8 et un modèle de format prédéfini, les utilisateurs peuvent rencontrer une erreur d'analyse en raison d'un deux-points manquant dans le décalage.

Le coupable : Un bug Java 8

Ce problème d'analyse provient d'un bug dans Java 8 qui empêche la classe OffsetDateTime d'analyser correctement les décalages sans deux-points entre les heures et les minutes. Ce bug affecte les décalages tels que " 0000" mais pas " 00:00". ) Hack de manipulation de chaîne :

Modifiez la chaîne d'entrée pour ajouter les deux points manquants avant l'analyse :

(b) DateTimeFormatter explicite :

Définissez un DateTimeFormatter avec un modèle spécifique pour guider l'analyse :
<code class="java">String input = "2018-02-13T10:20:12.120+0000".replace("+0000", "+00:00");
OffsetDateTime odt = OffsetDateTime.parse(input);</code>
Copier après la connexion

Autres améliorations :

Pour plus modèle de formatage adaptable, utilisez un DateTimeFormatterBuilder :
<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>
Copier après la connexion

Recommandation :

Pour simplifier l'analyse, assurez-vous que les décalages incluent toujours deux points, incluent à la fois les heures et minutes (même si zéro) et utilisez des zéros de remplissage (-05:00 au lieu de -5).
<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>
Copier après la connexion

Notes supplémentaires :

Pour valeurs en UTC, utilisez Instant :

  1. Pour obtenir la représentation de l'horloge murale d'un fuseau horaire spécifique :
<code class="java">Instant instant = odt.toInstant();</code>
Copier après la connexion
  1. Éviter l'héritage cours date-heure ; utilisez plutôt java.time.
<code class="java">ZoneId z = ZoneId.of("America/Montreal");
ZonedDateTime zdt = odt.atZoneSameInstant(z);</code>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal