O trecho de código a seguir é executado sem erros no Java 8. No entanto, quando executo o mesmo código no Java 17, ele falha.
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
public class Main2 {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH[:mm[:ss[.SSS]]]X");
OffsetDateTime offSetDateTime = OffsetDateTime.parse("2021-10-09T08:59:00.00Z", formatter);
System.out.println(offSetDateTime);
}
}
Saída quando executado em Java 17:
Exception in thread "main" java.time.format.DateTimeParseException: Text '2021-10-09T08:59:00.00Z' could not be parsed at index 19
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2052)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1954)
at java.base/java.time.OffsetDateTime.parse(OffsetDateTime.java:404)
at Main2.main(Main2.java:9)
No entanto, se eu executar o mesmo código no Java 8, o seguinte resultado será obtido:
2021-10-09T08:59Z
Se eu alterar os dados de teste de "2021-10-09T08:59:00.00Z"
para "2021-10-09T08:59:00.000Z"
, ele funcionará no Java 17. Alguma ideia de quais mudanças no Java 17 causaram falha?
Esse comportamento parece ser causado pela correção do JDK-8230136 .
JDK-8230136 é o problema de que o campo de fração de segundo não verifica sua largura mínima. Se você fizer
appendFraction(NANO_OF_SECOND, 3, 3, false)
isso emDateTimeFormatterBuilder
, 1, 2 ou 3 dígitos serão todos aceitos por esse campo.DateTimeFormatter
usaDateTimeFormatterBuilder
sob o capô e, portanto, também é afetado. OSSS
no seu padrão eventualmente leva a uma chamada comoappendFraction(NANO_OF_SECOND, 3, 3, false)
em um arquivoDateTimeFormatterBuilder
.Se precisar do comportamento antigo, você pode ligar
appendFraction
com sua própria contagem mínima de dígitos.