Format LocalDateTime avec le Fuseau horaire de Java8
J'ai le ce simple code:
DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss.SSSSSS Z");
LocalDateTime.now().format(FORMATTER)
Alors j'aurai exception suivante:
java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: OffsetSeconds
at java.time.LocalDate.get0(LocalDate.java:680)
at java.time.LocalDate.getLong(LocalDate.java:659)
at java.time.LocalDateTime.getLong(LocalDateTime.java:720)
at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
at java.time.format.DateTimeFormatterBuilder$OffsetIdPrinterParser.format(DateTimeFormatterBuilder.java:3315)
at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2182)
at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1745)
at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1719)
at java.time.LocalDateTime.format(LocalDateTime.java:1746)
Comment résoudre ce problème?
Vous devez vous connecter pour publier un commentaire.
LocalDateTime
est une date-heure sans un fuseau horaire. Vous avez spécifié le décalage de fuseau horaire format de symbole dans le format, cependant,LocalDateTime
n'a pas de telles informations. C'est pourquoi l'erreur s'est produite.Si vous voulez le temps de la zone d'informations, vous devez utiliser
ZonedDateTime
.Le préfixe "Local" dans la JSR-310 (aka java.temps-package en Java-8) n'indique pas qu'il y a un fuseau horaire de l'information dans l'état interne de la classe (ici:
LocalDateTime
). Malgré la souvent trompeuses nom de ces classes commeLocalDateTime
ouLocalTime
ont PAS d'informations sur le fuseau horaire ou de compenser.Vous essayé de formater une telle type (qui ne contiennent pas de décalage) avec un décalage de l'information (indiqué par le symbole en forme de Z). Ainsi, le formateur tente d'accéder à une absence de disponibilité des informations et a lancer l'exception que vous avez observé.
Solution:
Utiliser un type qui a un tel décalage ou des informations de fuseau horaire. Dans la JSR-310 c'est soit
OffsetDateTime
(qui contient un décalage, mais pas d'un fuseau horaire, y compris l'heure d'été règles) ouZonedDateTime
. Vous pouvez regarder tous les champs pris en charge de ce type de look-up sur la méthode isSupported(TemporalField).. Le domaineOffsetSeconds
est pris en charge dansOffsetDateTime
etZonedDateTime
, mais pas dansLocalDateTime
.PlainDateTime
etc. Probablement meilleur parce que le préfixe "plaine" indique qu'il n'est rien de plus que juste la date-heure. Si nous étions encore avant de Java v1.0 alors pas de préfixe aurait été mieux, mais des noms commeDate
etc. sont déjà réservés par les vieux JDK.LocalDateTime.maintenant().format(DateTimeFormatter.ofPattern("aaaammjj HH:mm:ss.SSSSSS Z"));