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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top