J'ai réussi à analyser un String
vers un objet LocalDate
:
DateTimeFormatter f1=DateTimeFormatter.ofPattern("dd MM yyyy");
LocalDate d=LocalDate.parse("26 08 1984",f1);
System.out.println(d); //prints "1984-08-26"
Mais je ne peux pas faire de même avec LocalTime
. Ce morceau de code:
DateTimeFormatter f2=DateTimeFormatter.ofPattern("hh mm");
LocalTime t=LocalTime.parse("11 08",f2); //exception here
System.out.println(t);
Lance un DateTimeParseException
:
Exception in thread "main" Java.time.format.DateTimeParseException: Text '11 08' could not be parsed: Unable to obtain LocalTime from TemporalAccessor: {MinuteOfHour=8, HourOfAmPm=11},ISO of type Java.time.format.Parsed
at Java.time.format.DateTimeFormatter.createError(Unknown Source)
at Java.time.format.DateTimeFormatter.parse(Unknown Source)
at Java.time.LocalTime.parse(Unknown Source)
at com.mui.cert.Main.<init>(Main.Java:21)
at com.mui.cert.Main.main(Main.Java:12)
Caused by: Java.time.DateTimeException: Unable to obtain LocalTime from TemporalAccessor: {MinuteOfHour=8, HourOfAmPm=11},ISO of type Java.time.format.Parsed
at Java.time.LocalTime.from(Unknown Source)
at Java.time.LocalTime$$Lambda$15/1854731462.queryFrom(Unknown Source)
at Java.time.format.Parsed.query(Unknown Source)
... 4 more
Qu'est-ce que je fais mal?
Si vous utilisez un format spécifique, selon API :
La chaîne doit représenter une heure valide et est analysée à l'aide de
DateTimeFormatter.ISO_LOCAL_TIME
.
hh mm
pour 24h doit être
HH mm
ou pour 12h
kk mm
Les formats manipulés doivent avoir les conditions suivantes:
Dans ce cas Unable to obtain LocalTime from TemporalAccessor
signifie qu'il ne peut pas déterminer la longueur de la chaîne donnée, c'est-à-dire qu'il n'y a pas suffisamment d'informations pour construire un LocalTime
. Dans les coulisses, le code ressemble à ceci développé Java 8 (qui donne une erreur similaire):
DateTimeFormatter f2 = DateTimeFormatter.ofPattern("hh mm");
TemporalAccessor temporalAccessor = f2.parse("11 08");
LocalTime t = temporalAccessor.query(LocalTime::from);
System.out.println(t);
Le LocalTime::from
la documentation dit
La conversion utilise la requête TemporalQueries.localTime (), qui repose sur l'extraction du champ NANO_OF_DAY.
Votre erreur vous indique que le TemporalAccessor
n'a que deux champs, dont aucun n'est un NANO_OF_DAY
champ. Les modèles minimum autorisés pour récupérer un LocalTime
à l'aide d'un DateTimeFormatter
sont:
DateTimeFormatter.ofPattern("ha");
DateTimeFormatter.ofPattern("Ka");
DateTimeFormatter.ofPattern("ah");
DateTimeFormatter.ofPattern("aK");
DateTimeFormatter.ofPattern("k");
DateTimeFormatter.ofPattern("H");
Votre modèle doit contenir au moins une de ces chaînes pour obtenir un NANO_OF_DAY
champ dans le TemporalAccessor
interne à partir duquel un LocalTime
peut être construit.
Utilisez DateTimeFormatter.ofPattern("kk mm")
; pour horloge 12 heures ou DateTimeFormatter.ofPattern("HH mm")
pour horloge 24 heures
Si vous voulez analyser le temps avec hh
, vous devez le combiner avec a
où vous définissez AM ou PM:
DateTimeFormatter f2 = DateTimeFormatter.ofPattern("hh mm a");
LocalTime t = LocalTime.parse("11 08 AM", f2);
Vous devez utiliser le capital HH dans le modèle
DateTimeFormatter f2=DateTimeFormatter.ofPattern("HH mm");
ou faites ceci, pour clock-hour-of-am-pm
vous devez le spécifier.
Cela devrait également fonctionner
DateTimeFormatter f2=DateTimeFormatter.ofPattern("hh mm a");
LocalTime t=LocalTime.parse("11 08 AM",f2); //exception here