Ich habe diesen einfachen Code:
DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss.SSSSSS Z");
LocalDateTime.now().format(FORMATTER)
Dann bekomme ich folgende Ausnahme:
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)
Wie kann ich dieses Problem beheben?
Das Präfix "Local" in JSR-310 (auch bekannt als java.time-package in Java-8) gibt nicht an, dass sich im internen Status dieser Klasse Zeitzoneninformationen befinden (hier :)
LocalDateTime
. Trotz des oft irreführenden Namens mögenLocalDateTime
oderLocalTime
haben solche Klassen KEINE Zeitzoneninformationen oder Offset .Sie haben versucht, einen solchen zeitlichen Typ (der keinen Versatz enthält) mit Versatzinformationen (angezeigt durch das Mustersymbol Z) zu formatieren. Der Formatierer versucht also, auf nicht verfügbare Informationen zuzugreifen, und muss die von Ihnen beobachtete Ausnahme auslösen.
Lösung:
Verwenden Sie einen Typ mit solchen Offset- oder Zeitzoneninformationen. In JSR-310 ist dies entweder
OffsetDateTime
(das einen Offset, aber keine Zeitzone einschließlich DST-Regeln enthält) oderZonedDateTime
. Sie können alle unterstützten Felder eines solchen Typs durch Nachschlagen der Methode isSupported (TemporalField) überwachen. . Das FeldOffsetSeconds
wird inOffsetDateTime
undZonedDateTime
, aber nicht in unterstütztLocalDateTime
.quelle
PlainDateTime
usw. vorschlug . Wahrscheinlich besser, weil das Präfix "plain" anzeigt, dass es nicht mehr als nur Datum und Uhrzeit gibt. Wenn wir noch vor Java v1.0 wären, wäre kein Präfix besser gewesen, aber Namen wieDate
usw. sind bereits vom alten JDK reserviert.LocalDateTime.now (). Format (DateTimeFormatter.ofPattern ("yyyyMMdd HH: mm: ss.SSSSSS Z"));
quelle