Saltar al contenido

SimpleDateFormat dando una fecha incorrecta en lugar de error

Después de de esta extensa compilación de datos resolvimos este asunto que suelen tener muchos lectores. Te compartimos la respuesta y nuestro objetivo es servirte de mucha ayuda.

Solución:

Usar DateFormat.setLenient(false) decirle al DateFormat/SimpleDateFormat que quieres que sea estricto.

Set Lenient funcionará en la mayoría de los casos, pero si desea verificar el string patrón, entonces esto podría ayudar,

    String s = "03/6/1988";
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    try 
        sdf.setLenient(false);
        Date d = sdf.parse(s);
        String s1 = sdf.format(d);
        if (s1.equals(s))
            System.out.println("Valid");
        else
            System.out.println("Invalid");
     catch (ParseException ex) 
        // TODO Auto-generated catch block
        ex.printStackTrace();
    

Si da la entrada como “03/06/1988”, obtendrá un resultado válido.

java.time

Me gustaría contribuir con la respuesta moderna. Cuando se hizo esta pregunta en 2011, era razonable utilizar SimpleDateFormat y Date. Ya no lo es. Esas clases siempre estuvieron mal diseñadas y fueron reemplazadas por java.time, la API moderna de fecha y hora de Java, en 2014, por lo que ahora están desactualizadas.

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MM-uuuu");

    String dateString = "13-13-2007";
    LocalDate date = LocalDate.parse(dateString, dateFormatter);

Este código proporciona la excepción que esperaba (y tenía buenas razones para esperar):

Excepción en el hilo “principal” java.time.format.DateTimeParseException: No se pudo analizar el texto ’13 -13-2007 ‘: Valor no válido para MonthOfYear (valores válidos 1 – 12): 13

Tenga en cuenta también y disfrute el mensaje de excepción preciso e informativo.

DateTimeFormatter tiene tres estilos de resolución, estricto, inteligente y tolerante. Inteligente es el valor predeterminado y rara vez necesitará algo más. Utilice estricto si desea asegurarse de detectar todas las fechas no válidas en todas las circunstancias.

Enlaces

  • Tutorial de Oracle: Fecha y hora que explica cómo usar java.time.
  • uuuu versus yyyy en DateTimeFormatter formateo de códigos de patrón en Java?

Aquí puedes ver las reseñas y valoraciones de los lectores

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *