Pregunta

¿Hay un buen analizador de fecha estricto para Java? Tengo acceso a Joda-Time pero aún no he visto esta opción. Encontré el & "; ¿Hay un buen analizador de fechas para Java &"; pregunta, y si bien esto está relacionado, es todo lo contrario. Mientras que esa pregunta pedía un analizador indulgente, más difuso y propenso al error humano, quisiera un analizador estricto. Por ejemplo, con JodaTime (por lo que puedo decir) y simpleDateFormat, si tiene un formato & Quot; MM / dd / aaaa & Quot ;:

analiza esto: 40/40/4353

Esto se convierte en una fecha válida. Quiero un analizador que sepa que 40 es un mes y una fecha no válidos. ¿Seguramente existe alguna implementación de esto en Java?

¿Fue útil?

Solución

No veo que Joda reconozca eso como una fecha válida. Ejemplo:

strict = org.joda.time.format.DateTimeFormat.forPattern("MM/dd/yyyy")
try {
    strict.parseDateTime('40/40/4353')
    assert false
} catch (org.joda.time.IllegalFieldValueException e) {
    assert 'Cannot parse "40/40/4353": Value 40 for monthOfYear must be in the range [1,12]' == e.message
}



Por lo que puedo decir, tampoco DateFormat con setLenient (false) . Ejemplo:

try {
    df = new java.text.SimpleDateFormat('MM/dd/yyyy')
    df.setLenient(false)
    df.parse('40/40/4353')
    assert false
} catch (java.text.ParseException e) {
    assert e.message =~ 'Unparseable'
}

¡Espero que esto ayude!

Otros consejos

Una buena forma de hacer una validación estricta con el formato de fecha es formatear la fecha analizada y verificar la igualdad en la cadena original:

String myDateString = "87/88/9999";
Date myDate = dateFormat.parse(myDateString);
if (!myDateString.equals(df.format(myDate))){
  throw new ParseException();
}

Funciona como un encanto.

Puede usar apache.commons.validator.routines.DateValidator para validar la fecha, si no desea usar SimpleDateFormat.

Ejemplo:

 public static Date validateDate(String value, String pattern) {
       DateValidator validator = new DateValidator();
       Date date = null;
           if (pattern!=null) {    //Pattern is passed
               date = validator.validate(value, pattern);
           } else {
               date = validator.validate(value);
           }
       return date;
    }

Entonces, si se devuelve un nulo , significa que la fecha no es válida; de lo contrario, es una fecha válida. Este método es una alternativa al uso de <=> ya que no tiene que confiar Se lanza una excepción para identificar si es una fecha válida o no.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top