print - No se puede obtener LocalDateTime de TemporalAccessor al analizar LocalDateTime(Java 8)
localdatetime yyyymmdd (9)
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
here
, pero recibo una excepción.
Estoy usando
JDK-8u25
.
Ampliando
la respuesta de la retrografía
...: tuve este mismo problema incluso cuando usaba
LocalDate
y no
LocalDateTime
.
El problema era que había creado mi
DateTimeFormatter
usando
.withResolverStyle(ResolverStyle.STRICT);
, así que tuve que usar el patrón de fecha
uuuuMMdd
lugar de
yyyyMMdd
(es decir, "año" en lugar de "año de la era").
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseStrict()
.appendPattern("uuuuMMdd")
.toFormatter()
.withResolverStyle(ResolverStyle.STRICT);
LocalDate dt = LocalDate.parse("20140218", formatter);
(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 realmente bien para muchas personas).
Este es un mensaje de error realmente poco claro e inútil.
Después de muchas pruebas y errores, descubrí que
LocalDateTime
dará el error anterior si no intenta analizar una hora.
Al usar
LocalDate
en
LocalDate
lugar, funciona sin errores.
Esto está mal documentado y la excepción relacionada es muy poco útil.
Esto funciona bien
public class DateDemo {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm");
String date = "16-08-2018 12:10";
LocalDate localDate = LocalDate.parse(date, formatter);
System.out.println("VALUE="+localDate);
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
LocalDateTime parse = LocalDateTime.parse(date, formatter1);
System.out.println("VALUE1="+parse);
}
}
salida:
VALUE=2018-08-16
VALUE1=2018-08-16T12:10
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:
LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy h:mm"));
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:
LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy H:mm"));
Para lo que vale la pena si alguien debería leer nuevamente este tema (como yo), la respuesta correcta estaría en la definición de
DateTimeFormatter
, por ejemplo:
private static DateTimeFormatter DATE_FORMAT =
new DateTimeFormatterBuilder().appendPattern("dd/MM/yyyy[ [HH][:mm][:ss][.SSS]]")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.toFormatter();
Se deben configurar los campos opcionales si aparecerán. Y el resto del código debería ser exactamente el mismo.
Prueba este:
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MM-dd-yyyy");
LocalDate fromLocalDate = LocalDate.parse(fromdstrong textate, dateTimeFormatter);
Puede agregar cualquier formato que desee. ¡Funciona para mi!
Resulta que Java no acepta un valor de fecha simple como DateTime. El uso de LocalDate en lugar de LocalDateTime resuelve el problema:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate dt = LocalDate.parse("20140218", formatter);
Si la cadena de fecha no incluye ningún valor para horas, minutos, etc., no puede convertirlo directamente a
LocalDateTime
.
Solo puede convertirlo a
LocalDate
, porque la cadena
solo
representa
los componentes de
año, mes y fecha
, sería lo correcto.
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf); // 2018-03-06
De todos modos, puede convertir esto a
LocalDateTime
.
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf);
LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(0,0)); // 2018-03-06T00:00
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:
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime time = LocalDate.parse("20140218", formatter).atStartOfDay();