Diferencia entre parse () de DateFormat y SimpleDateFormat

Jigar Naik:

Estoy tratando de analizar la fecha usando LocalDateTime.parseel método sin embargo yo estoy haciendo por debajo de error. la cadena de fecha se está poniendo de análisis si uso SimpleDateFormatsencillo objeto formato de fecha.

Alguien ha enfrentado este problema! ¿Cuál es la diferencia entre el análisis sintáctico de DateFormatyLocalDateTime

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
Gracias completo Guy:

Está utilizando el reloj en hora-de-am-pm (1-12) para la hora que es hen 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.

introducir descripción de la imagen aquí

De manera ideal, el AM / PM debe ser mencionado en la cadena de fecha que ha de ser analizado junto con el ade la mañana-tarde del día que también necesita ser añadido en la DATE_TIME_PATTERNcadena.

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 SimpleDateFormatse trabaja, mientras que LocalDateTimees 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 LocalTimeregresar de la TemporalAccessores nully por lo tanto de que está recibiendo Unable to obtain LocalTime from TemporalAccessor.

Sin venir a por qué SimpleDateFormatestá trabajando, hay un método llamado setLenient(boolean lenient)si se pasa horas que es mayor que 12sin mencionar aen 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 10esta es menor que 12y 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;

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=176156&siteId=1
Recomendado
Clasificación