java - localdatetime - JDK8: no se puede analizar LocalTime
string to date java 8 (4)
Me las arreglé para analizar una String a un objeto LocalDate :
DateTimeFormatter f1=DateTimeFormatter.ofPattern("dd MM yyyy");
LocalDate d=LocalDate.parse("26 08 1984",f1);
System.out.println(d); //prints "1984-08-26"
Pero no puedo hacer lo mismo con LocalTime . Esta pieza de código:
DateTimeFormatter f2=DateTimeFormatter.ofPattern("hh mm");
LocalTime t=LocalTime.parse("11 08",f2); //exception here
System.out.println(t);
Lanza una 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é estoy haciendo mal?
En este caso, Unable to obtain LocalTime from TemporalAccessor significa que no puede determinar la distancia a la que representa la cadena dada, es decir, no hay suficiente información para construir un LocalTime . Detrás de las escenas, el código se parece a esta versión de Java 8 expandida (que da un error similar):
DateTimeFormatter f2 = DateTimeFormatter.ofPattern("hh mm");
TemporalAccessor temporalAccessor = f2.parse("11 08");
LocalTime t = temporalAccessor.query(LocalTime::from);
System.out.println(t);
El LocalTime::from documentación dice
La conversión utiliza la consulta TemporalQueries.localTime (), que se basa en la extracción del campo NANO_OF_DAY.
Su error le indica que TemporalAccessor solo tiene dos campos, ninguno de los cuales es un campo NANO_OF_DAY . Los patrones mínimos permitidos para recuperar un LocalTime utilizando un DateTimeFormatter son:
DateTimeFormatter.ofPattern("ha");
DateTimeFormatter.ofPattern("Ka");
DateTimeFormatter.ofPattern("ah");
DateTimeFormatter.ofPattern("aK");
DateTimeFormatter.ofPattern("k");
DateTimeFormatter.ofPattern("H");
Su patrón debe contener al menos una de esas cadenas para obtener un campo NANO_OF_DAY en el TemporalAccessor interno desde el cual se puede construir un LocalTime .
Necesitas usar HH mayúscula en el patrón.
DateTimeFormatter f2=DateTimeFormatter.ofPattern("HH mm");
o haga esto, para la clock-hour-of-am-pm debe especificarlo.
Esto también debería funcionar
DateTimeFormatter f2=DateTimeFormatter.ofPattern("hh mm a");
LocalTime t=LocalTime.parse("11 08 AM",f2); //exception here
Si utiliza un formato específico, de acuerdo con la API :
La cadena debe representar una hora válida y se analiza utilizando
DateTimeFormatter.ISO_LOCAL_TIME.
hh mm
por 24h debe ser
HH mm
o por 12h
kk mm
Los formatos manejados deben tener estas condiciones:
- Dos dígitos para la hora del día. Esto se rellena previamente con cero para garantizar dos dígitos.
- Un colon
- Dos dígitos para el minuto de la hora. Esto se rellena previamente con cero para garantizar dos dígitos.
- Si el segundo de minuto no está disponible, el formato está completo.
- Un colon
- Dos dígitos para el segundo minuto. Esto se rellena previamente con cero para garantizar dos dígitos.
- Si el nano-segundo es cero o no está disponible, el formato está completo.
- Un punto decimal
- Uno a nueve dígitos para el nano de segundo. Se emitirán tantos dígitos como sea necesario.
Utilice DateTimeFormatter.ofPattern("kk mm") ; para el reloj de 12 horas o DateTimeFormatter.ofPattern("HH mm") para el reloj de 24 horas
Si desea analizar el tiempo con hh , debe combinarlo con a donde defina AM o PM:
DateTimeFormatter f2 = DateTimeFormatter.ofPattern("hh mm a");
LocalTime t = LocalTime.parse("11 08 AM", f2);