Maison  >  Article  >  Java  >  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
Barbara Streisandoriginal
2024-10-31 07:10:01386parcourir

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>

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>

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>

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

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