Je jouais avec la nouvelle API de date et d'heure, mais en exécutant ceci:
public class Test {
public static void main(String[] args){
String dateFormatted = LocalDate.now()
.format(DateTimeFormatter
.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(dateFormatted);
}
}
Il jette:
Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: HourOfDay
at java.time.LocalDate.get0(LocalDate.java:680)
at java.time.LocalDate.getLong(LocalDate.java:659)
at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
at java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2543)
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.LocalDate.format(LocalDate.java:1685)
at Test.main(Test.java:23)
En regardant le code source de la classe LocalDate, je vois:
private int get0(TemporalField field) {
switch ((ChronoField) field) {
case DAY_OF_WEEK: return getDayOfWeek().getValue();
case ALIGNED_DAY_OF_WEEK_IN_MONTH: return ((day - 1) % 7) + 1;
case ALIGNED_DAY_OF_WEEK_IN_YEAR: return ((getDayOfYear() - 1) % 7) + 1;
case DAY_OF_MONTH: return day;
case DAY_OF_YEAR: return getDayOfYear();
case EPOCH_DAY: throw new UnsupportedTemporalTypeException("Invalid field 'EpochDay' for get() method, use getLong() instead");
case ALIGNED_WEEK_OF_MONTH: return ((day - 1) / 7) + 1;
case ALIGNED_WEEK_OF_YEAR: return ((getDayOfYear() - 1) / 7) + 1;
case MONTH_OF_YEAR: return month;
case PROLEPTIC_MONTH: throw new UnsupportedTemporalTypeException("Invalid field 'ProlepticMonth' for get() method, use getLong() instead");
case YEAR_OF_ERA: return (year >= 1 ? year : 1 - year);
case YEAR: return year;
case ERA: return (year >= 1 ? 1 : 0);
}
throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
}
Comme il est décrit dans le doc:
Cette méthode créera un formateur basé sur un modèle simple de lettres et de symboles comme décrit dans la documentation de la classe.
Et toutes ces lettres sont définies .
Alors pourquoi DateTimeFormatter.ofPattern
ne nous permet-il pas d'utiliser des lettres de modèle?
java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: DayOfWeek
DateTimeFormatter.ofPattern("HH:mm:ss")
Je voudrais ajouter les détails suivants à la bonne réponse de @James_D:
Contexte: La plupart des bibliothèques de date et d'heure (
java.util.Calendar
en Java, voir aussi .Net-DateTime ouDate
en JavaScript ouDateTime
en Perl) sont basées sur le concept d'un type temporel unique universel universel (en allemand, il y a l'expression poétique " eierlegende Wollmilchsau "). Dans cette conception, il ne peut pas y avoir de champ non pris en charge. Mais le prix est élevé: de nombreux problèmes de temps ne peuvent pas être traités de manière adéquate avec une approche aussi peu flexible, car il est difficile voire impossible de trouver un dénominateur commun pour toutes sortes d'objets temporels.JSR-310 a choisi une autre façon , à savoir autoriser différents types temporels qui consistent en des ensembles spécifiques au type de champs intégrés pris en charge. La conséquence naturelle est que tous les champs possibles ne sont pas pris en charge par tous les types (et les utilisateurs peuvent même définir leurs propres champs spécialisés). Il est également possible de demander par programme à chaque objet de type
TemporalAccessor
son ensemble spécifique de champs pris en charge. CarLocalDate
nous trouvons:Il n'y a pas de champ HOUR_OF_DAY qui explique le problème de
UnsupportedTemporalTypeException
. Et si nous regardons le mappage JSR-310- des symboles de modèle aux champs, nous voyons que le symbole H est mappé à HOUR_OF_DAY non pris en charge:Ce mappage de champ ne signifie pas que le champ est pris en charge par le type concret. L'analyse se déroule en plusieurs étapes. Le mappage de champ n'est que la première étape. La deuxième étape consiste ensuite à analyser un objet brut de type
TemporalAccessor
. Et enfin analyser les délégués au type cible (iciLocalDate
:) et laissez-le décider s'il accepte toutes les valeurs de champ dans l'objet intermédiaire analysé.la source
La bonne classe pour moi était celle
ZonedDateTime
qui comprend à la fois l'heure et le fuseau horaire.LocalDate
n'a pas les informations de temps donc vous obtenez un fichierUnsupportedTemporalTypeException: Unsupported field: HourOfDay
.Vous pouvez utiliser
LocalDateTime
mais vous n'avez pas les informations de fuseau horaire, donc si vous essayez d'y accéder (même en utilisant l'un des formateurs prédéfinis), vous obtiendrez un fichierUnsupportedTemporalTypeException: Unsupported field: OffsetSeconds
.la source