Format LocalDateTime avec fuseau horaire dans Java8

J’ai le 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?

LocalDateTime est une date-heure sans fuseau horaire. Vous avez spécifié le symbole de format de décalage de fuseau horaire dans le format, cependant, LocalDateTime ne dispose pas de telles informations. C’est pourquoi l’erreur s’est produite.

Si vous voulez des informations de fuseau horaire, vous devez utiliser ZonedDateTime .

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

Le préfixe “Local” dans JSR-310 (alias java.time-package dans Java-8) n’indique pas qu’il existe une information de fuseau horaire à l’état interne de cette classe (ici: LocalDateTime ). Malgré le nom souvent trompeur, ces classes comme LocalDateTime ou LocalTime n’ont AUCUNE information ou décalage de fuseau horaire .

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 Z). Le formateur essaie donc d’accéder à une information non disponible et doit lancer l’exception que vous avez observée.

Solution:

Utilisez un type qui a une telle information de décalage ou de fuseau horaire. Dans JSR-310, il s’agit de OffsetDateTime (qui contient un décalage mais pas de fuseau horaire, y compris les règles DST) ou ZonedDateTime . Vous pouvez surveiller tous les champs pris en charge d’un tel type en consultant la méthode isSupported (TemporalField). . Le champ OffsetSeconds est pris en charge dans OffsetDateTime et ZonedDateTime , mais pas dans LocalDateTime .

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