webentwicklung-frage-antwort-db.com.de

Formatieren Sie LocalDateTime mit Zeitzone in Java8

Ich habe den folgenden 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 dieses Problem gelöst werden?

79
carfield

LocalDateTime ist ein Datum und eine Uhrzeit ohne Zeitzone. Sie haben das Format für das Zeitzonen-Offsetformat im Format angegeben, LocalDateTime verfügt jedoch nicht über solche Informationen. Deshalb ist der Fehler aufgetreten.

Wenn Sie Zeitzoneninformationen wünschen, sollten Sie ZonedDateTime verwenden.

DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss.SSSSSS Z");
ZonedDateTime.now().format(FORMATTER);
=> "20140829 14:12:22.122000 +09"
140
ntalbs

Das Präfix "Local" in JSR-310 (alias Java.time-Paket in Java-8) bedeutet nicht, dass sich im internen Zustand dieser Klasse eine Zeitzoneninformation befindet (hier: LocalDateTime). Trotz des oft irreführenden Namens haben Klassen wie LocalDateTime oder LocalTime KEINE Zeitzoneninformation oder Offset.

Sie haben versucht, einen solchen zeitlichen Typ (der keinen Versatz enthält) mit Versatzinformationen (angezeigt durch das Mustersymbol Z) zu formatieren. Das Formatierungsprogramm versucht daher, auf nicht verfügbare Informationen zuzugreifen, und muss die von Ihnen beobachtete Ausnahme auslösen.

Lösung: 

Verwenden Sie einen Typ, der über solche Versatz- oder Zeitzoneninformationen verfügt. In JSR-310 ist dies entweder OffsetDateTime (enthält einen Versatz, aber keine Zeitzone mit DST-Regeln) oder ZonedDateTime. Sie können alle unterstützten Felder eines solchen Typs über die Methode isSupported (TemporalField) nachsehen. . Das Feld OffsetSeconds wird in OffsetDateTime und ZonedDateTime unterstützt, jedoch nicht in LocalDateTime.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss.SSSSSS Z");
String s = ZonedDateTime.now().format(formatter);
36
Meno Hochschild