Esiste un buon parser di data * rigoroso * per Java?
Domanda
Esiste un parser di date rigoroso per Java? Ho accesso a Joda-Time ma devo ancora vedere questa opzione. Ho trovato il & Quot; Esiste un buon parser di date per Java & Quot; domanda, e mentre questo è correlato è un po 'l'opposto. Considerando che quella domanda chiedeva un parser indulgente, più logico e incline all'errore umano, vorrei un parser rigoroso. Ad esempio, sia con JodaTime (per quanto posso dire) sia con simpleDateFormat, se hai un formato & Quot; MM / gg / aaaa & Quot ;:
analizza questo: 40/40/4353
Questa diventa una data valida. Voglio un parser che sappia che 40 è un mese e una data non validi. Sicuramente una sua implementazione esiste in Java?
Soluzione
Non vedo che Joda la riconosce come una data valida. Esempio:
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
}
Per quanto ne sappia, DateFormat con setLenient (false) . Esempio:
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'
}
Spero che questo aiuti!
Altri suggerimenti
Un buon modo per eseguire una convalida rigorosa con DateFormat è riformattare la data analizzata e verificare l'uguaglianza con la stringa originale:
String myDateString = "87/88/9999";
Date myDate = dateFormat.parse(myDateString);
if (!myDateString.equals(df.format(myDate))){
throw new ParseException();
}
Funziona come un fascino.
Puoi utilizzare apache.commons.validator.routines.DateValidator
per convalidare la data, se non vuoi usare SimpleDateFormat
.
Esempio:
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;
}
Quindi, se viene restituito un null significa che la data non è valida, altrimenti è una data valida. Questo metodo è un'alternativa all'utilizzo di <=> in quanto non è necessario fare affidamento eccezione generata per identificare se è una data valida o meno.