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