Eu tenho este código simples:
DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss.SSSSSS Z");
LocalDateTime.now().format(FORMATTER)
Então, receberei a seguinte exceção:
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)
Como resolver esse problema?
O prefixo "Local" em JSR-310 (também conhecido como java.time-package em Java-8) não indica que há uma informação de fuso horário no estado interno dessa classe (aqui:)
LocalDateTime
. Apesar do nome muitas vezes enganoso, essas classes gostamLocalDateTime
ouLocalTime
NÃO têm informações de fuso horário ou deslocamento .Você tentou formatar esse tipo temporal (que não contém nenhum deslocamento) com informações de deslocamento (indicadas pelo símbolo de padrão Z). Portanto, o formatador tenta acessar uma informação indisponível e deve lançar a exceção que você observou.
Solução:
Use um tipo que tenha informações de deslocamento ou fuso horário. No JSR-310, isso é
OffsetDateTime
(que contém um deslocamento, mas não um fuso horário incluindo regras de horário de verão) ouZonedDateTime
. Você pode observar todos os campos suportados de tal tipo, consultando o método isSupported (TemporalField). . O campoOffsetSeconds
é compatível comOffsetDateTime
eZonedDateTime
, mas não comLocalDateTime
.fonte
PlainDateTime
etc. Provavelmente melhor porque o prefixo "plain" indica que não há nada mais do que apenas data-hora. Se ainda fôssemos antes do Java v1.0, nenhum prefixo seria melhor, mas nomes comoDate
etc. já estão reservados pelo JDK antigo.LocalDateTime.now (). Format (DateTimeFormatter.ofPattern ("aaaaMMdd HH: mm: ss.SSSSSS Z"));
fonte