Simplemente estoy tratando de convertir una cadena de fecha en un objeto DateTime en Java 8. Al ejecutar las siguientes líneas:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime dt = LocalDateTime.parse("20140218", formatter);
Obtuve el siguiente error:
Exception in thread "main" java.time.format.DateTimeParseException:
Text '20140218' could not be parsed:
Unable to obtain LocalDateTime from TemporalAccessor:
{},ISO resolved to 2014-02-18 of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1918)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1853)
at java.time.LocalDateTime.parse(LocalDateTime.java:492)
La sintaxis es idéntica a la que se ha sugerido aquí , pero recibo una excepción. Estoy usando JDK-8u25
.
java
datetime
java-8
datetime-format
retrografía
fuente
fuente
LocalDate
y noLocalDateTime
. ¡El problema era que había creado miDateTimeFormatter
uso.withResolverStyle(ResolverStyle.STRICT);
, así que tuve que usar el patrón de fecha enuuuuMMdd
lugar deyyyyMMdd
(es decir, "año" en lugar de "año de la era")!Si realmente necesita transformar una fecha en un objeto LocalDateTime, puede usar LocalDate.atStartOfDay (). Esto le dará un objeto LocalDateTime en la fecha especificada, con los campos de hora, minuto y segundo establecidos en 0:
fuente
LocalDateTime.from
Parece innecesario, comoatStartOfDay()
ya regresaLocalDateTime
.Para lo que vale la pena si alguien debería leer nuevamente este tema (como yo), la respuesta correcta estaría en
DateTimeFormatter
definición, por ejemplo:Uno debería establecer los campos opcionales si aparecerán. Y el resto del código debería ser exactamente el mismo.
fuente
parseDefaulting
DESPUÉS de haber llamadoappendPattern
. De lo contrario, daráDateTimeParseException
.Este es un mensaje de error realmente poco claro e inútil. Después de mucho ensayo y error, descubrí que
LocalDateTime
dará el error anterior si no intenta analizar una hora. Al usar en suLocalDate
lugar, funciona sin errores.Esto está mal documentado y la excepción relacionada es muy poco útil.
fuente
Ampliando la respuesta de la retrografía ...: tuve este mismo problema incluso cuando lo usaba
LocalDate
y noLocalDateTime
. ¡El problema era que había creado miDateTimeFormatter
uso.withResolverStyle(ResolverStyle.STRICT);
, así que tuve que usar el patrón de fecha enuuuuMMdd
lugar deyyyyMMdd
(es decir, "año" en lugar de "año de la era")!(Esta solución fue originalmente un comentario a la respuesta de la retrografía, pero me animaron a publicarla como una respuesta independiente porque aparentemente funciona muy bien para muchas personas).
fuente
Para cualquiera que aterrizó aquí con este error, como hice yo:
Unable to obtain LocalDateTime from TemporalAccessor: {HourOfAmPm=0, MinuteOfHour=0}
Provenía de la siguiente línea:
Resultó que era porque estaba usando un patrón de 12 horas en una hora 0, en lugar de un patrón de 24 horas.
Cambiando el patrón de la hora a 24 horas usando una H mayúscula lo arregla:
fuente
Si la fecha de cuerdas no incluye ningún valor para las horas, minutos y etc no se puede convertir directamente a un
LocalDateTime
. Solo puede convertirlo a aLocalDate
, porque la cadena solo representa los componentes de año, mes y fecha , sería lo correcto.De todos modos puedes convertir esto a
LocalDateTime
.fuente
yyyy-mm-dd
cuando debería haber sidoyyyy-MM-dd
.Prueba este:
Puede agregar cualquier formato que desee. ¡Funciona para mi!
fuente
Esto funciona bien
salida:
fuente