web-dev-qa-db-fra.com

JDK8: impossible d'analyser LocalTime

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?

18
Luigi Cortese

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:

  • Deux chiffres pour l'heure du jour. Ceci est pré-rempli par zéro pour garantir deux chiffres.
  • Un colon
  • Deux chiffres pour la minute de l'heure. Ceci est pré-rempli par zéro pour garantir deux chiffres.
  • Si la seconde n'est pas disponible, le format est terminé.
  • Un colon
  • Deux chiffres pour la seconde de minute. Ceci est pré-rempli par zéro pour garantir deux chiffres.
  • Si la nano-seconde est nulle ou non disponible, le formatage est terminé.
  • Un point décimal
  • Un à neuf chiffres pour la nano de seconde. Autant de chiffres seront sortis que nécessaire.
20
Jordi Castilla

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.

3
Alex Taylor

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);
3
walkeros

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
1
dogant