parse localdatetime from create convertir java java-8 date-parsing

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