Estoy tratando de analizar la fecha usando LocalDateTime.parse
el método sin embargo yo estoy haciendo por debajo de error. la cadena de fecha se está poniendo de análisis si uso SimpleDateFormat
sencillo objeto formato de fecha.
Alguien ha enfrentado este problema! ¿Cuál es la diferencia entre el análisis sintáctico de DateFormat
yLocalDateTime
package com.example.demo;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
public class App {
public static final String DATE_TIME_PATTERN = "dd-MM-yyyy hh:mm:ss.SSS";
public static final DateFormat DATE_TIME_FORMAT = new SimpleDateFormat(DATE_TIME_PATTERN);
public static final String SEPERATOR = ",";
public static void main(String[] args) {
try {
Date date = DATE_TIME_FORMAT.parse("12-03-2019 10:28:50.013");
System.out.println("date : {} " + date);
LocalDateTime startTimestamp = LocalDateTime.parse("12-03-2019 10:28:50.013", DateTimeFormatter.ofPattern(DATE_TIME_PATTERN)).plusNanos(1000000);
System.out.println("startTimestamp : {} " + startTimestamp);
} catch(Exception e) {
e.printStackTrace();
}
}
}
SALIDA
date : {} Tue Mar 12 10:28:50 SGT 2019
java.time.format.DateTimeParseException: Text '12-03-2019 10:28:50.013' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {NanoOfSecond=13000000, HourOfAmPm=10, MicroOfSecond=13000, SecondOfMinute=50, MilliOfSecond=13, MinuteOfHour=28},ISO resolved to 2019-03-12 of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1855)
at java.time.LocalDateTime.parse(LocalDateTime.java:492)
at com.example.demo.App.main(App.java:21)
Caused by: java.time.DateTimeException: Unable to obtain LocalDateTime from TemporalAccessor: {NanoOfSecond=13000000, HourOfAmPm=10, MicroOfSecond=13000, SecondOfMinute=50, MilliOfSecond=13, MinuteOfHour=28},ISO resolved to 2019-03-12 of type java.time.format.Parsed
at java.time.LocalDateTime.from(LocalDateTime.java:461)
at java.time.format.Parsed.query(Parsed.java:226)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
... 2 more
Caused by: java.time.DateTimeException: Unable to obtain LocalTime from TemporalAccessor: {NanoOfSecond=13000000, HourOfAmPm=10, MicroOfSecond=13000, SecondOfMinute=50, MilliOfSecond=13, MinuteOfHour=28},ISO resolved to 2019-03-12 of type java.time.format.Parsed
at java.time.LocalTime.from(LocalTime.java:409)
at java.time.LocalDateTime.from(LocalDateTime.java:457)
... 4 more
Está utilizando el reloj en hora-de-am-pm (1-12) para la hora que es h
en su patrón y no horas del día (0-23) que es H
, por lo que necesita la información adicional de la AM / PM.
De manera ideal, el AM / PM debe ser mencionado en la cadena de fecha que ha de ser analizado junto con el a
de la mañana-tarde del día que también necesita ser añadido en la DATE_TIME_PATTERN
cadena.
public static final String DATE_TIME_PATTERN = "dd-MM-yyyy hh:mm:ss.SSS a";
public static final DateFormat DATE_TIME_FORMAT = new SimpleDateFormat(DATE_TIME_PATTERN);
public static final String SEPERATOR = ",";
public static void main(String[] args) {
try {
Date date = DATE_TIME_FORMAT.parse("12-03-2019 10:28:50.013 AM");
System.out.println("date : {} " + date);
LocalDateTime startTimestamp = LocalDateTime.parse("12-03-2019 10:28:50.013 AM", DateTimeFormatter.ofPattern(DATE_TIME_PATTERN)).plusNanos(1000000);
System.out.println("startTimestamp : {} " + startTimestamp);
} catch(Exception e) {
e.printStackTrace();
}
}
Salida:
date : {} Tue Mar 12 10:28:50 IST 2019
startTimestamp : {} 2019-03-12T10:28:50.014
Podemos ver que sin el formato adecuado SimpleDateFormat
se trabaja, mientras que LocalDateTime
es más estricta cuando se trata de analizar cadenas fecha no válida. En su caso ya que la información AM / PM requerido no está presente, el LocalTime
regresar de la TemporalAccessor
es null
y por lo tanto de que está recibiendo Unable to obtain LocalTime from TemporalAccessor
.
Sin venir a por qué SimpleDateFormat
está trabajando, hay un método llamado setLenient(boolean lenient)
si se pasa horas que es mayor que 12
sin mencionar a
en el patrón y AM / PM en la cadena de fecha una java.text.ParseException: Unparseable date:
será lanzada.
Sin embargo, puesto que en su caso está de paso de la hora como 10
esta es menor que 12
y por lo tanto se interpreta como AM por defecto.
Este es el código en la clase SimpleDateFormat donde esta comprobación está ocurriendo:
case PATTERN_HOUR1: // 'h' 1-based. eg, 11PM + 1 hour =>> 12 AM
if (!isLenient()) {
// Validate the hour value in non-lenient
if (value < 1 || value > 12) {
break parsing;
}
}
// [We computed 'value' above.]
if (value == calendar.getLeastMaximum(Calendar.HOUR) + 1) {
value = 0;
}
calb.set(Calendar.HOUR, value);
return pos.index;