tl; dr
Échec. Mais le même moment avec le même décalage dans un ZonedDateTime
fonctionne.OffsetDateTime échoue avec le formateur localisé avec FormatStyle de LONG ou FULL
Pourquoi?
Détails
lors de la location java.time
localisent automatiquement la représentation de chaîne d'un OffsetDateTime
via DateTimeFormatter.ofLocalizedDateTime
, appelant format
fonctionne que si le formatter porte un FormatStyle
de SHORT
ou MEDIUM
. Mais lorsque le formateur porte LONG
ou FULL
, un DateTimeException
est levé. Pourtant ZonedDateTime
réussit en utilisant le même moment avec le même offset. Pourquoi?
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG) ;
OffsetDateTime odt = OffsetDateTime.now(ZoneId.systemDefault()) ;
ZonedDateTime zdt = odt.atZoneSameInstant(odt.getOffset()) ; // Generate a `ZonedDateTime` with same moment and same offset as the `OffsetDateTime`.
// Succeeds.
String outputZdt = zdt.format(f) ;
System.out.println("outputZdt: " + outputZdt) ;
// Fails. Throws exception.
if (false) {
String outputOdt = odt.format(f) ; // Throws exception.
System.out.println("outputOdt: " + outputOdt) ;
}
Voir ceci code run live at IdeOne.com.
Lors de l'exécution ...
Le bon.
outputZdt 16 Septembre, 2017 08:42:14 Z
mauvais.
Exception in thread "main" java.time.DateTimeException: Unable to extract value: class java.time.OffsetDateTime
at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:282)
at java.time.format.DateTimeFormatterBuilder$ZoneTextPrinterParser.format(DateTimeFormatterBuilder.java:3682)
at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2179)
at java.time.format.DateTimeFormatterBuilder$LocalizedPrinterParser.format(DateTimeFormatterBuilder.java:4347)
at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2179)
at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1746)
at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1720)
at java.time.OffsetDateTime.format(OffsetDateTime.java:1674)
at Ideone.main(Main.java:28)
J'ai écrit le cœur de ce code pour contourner l'exception levée, odt.atZoneSameInstant(odt.getOffset())
. Puis j'ai réalisé, pourquoi java.time
ne fait-il pas la même chose en interne? Pourquoi le OffsetDateTime
ne parvient pas à formater lorsqu'un ZonedDateTime
avec le même moment et le même décalage réussit? Pourquoi devrais-je besoin de faire cette conversion de OffsetDateTime
à ZonedDateTime
?
➟ Ce comportement d'échec de mise en forme OffsetDateTime
est-il un bug ou une fonctionnalité?
Je déposerais un rapport de bogue, mais je veux m'assurer que je ne comprends pas quelque chose.