J'ai ce code simple:
DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss.SSSSSS Z");
LocalDateTime.now().format(FORMATTER)
Ensuite, j'obtiendrai l'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?
Le préfixe "Local" dans JSR-310 (aka java.time-package dans Java-8) n'indique pas qu'il existe une information de fuseau horaire dans l'état interne de cette classe (ici :)
LocalDateTime
. Malgré le nom souvent trompeur, ces classes aimentLocalDateTime
ouLocalTime
n'ont AUCUNE information de fuseau horaire ou décalage .Vous avez essayé de formater un tel type temporel (qui ne contient aucun décalage) avec des informations de décalage (indiquées par le symbole de motif Z). Ainsi, le formateur tente d'accéder à une information indisponible et doit lever l'exception que vous avez observée.
Solution:
Utilisez un type qui a de telles informations de décalage ou de fuseau horaire. Dans JSR-310, c'est soit
OffsetDateTime
(qui contient un décalage mais pas un fuseau horaire incluant les règles DST) ouZonedDateTime
. Vous pouvez surveiller tous les champs pris en charge d'un tel type en recherchant la méthode isSupported (TemporalField). . Le champOffsetSeconds
est pris en charge dansOffsetDateTime
etZonedDateTime
, mais pas dansLocalDateTime
.la source
PlainDateTime
etc. Probablement mieux parce que le préfixe "plain" indique qu'il n'y a rien de plus que la date-heure. Si nous étions encore avant Java v1.0, aucun préfixe n'aurait été meilleur, mais des noms commeDate
etc. sont déjà réservés par l'ancien JDK.LocalDateTime.now (). Format (DateTimeFormatter.ofPattern ("aaaaMMjj HH: mm: ss.SSSSSS Z"));
la source