Il mio consiglio è quello di passare sempre indulgenti. Non riesco a pensare a un caso in cui desideri essere clemente e questa impostazione non dovrebbe mai essere l'impostazione predefinita per classi come SimpleDateFormat. L'elaborazione privilegiata può interpretare i dati inutili come stringhe temporali valide e apre errori che potrebbero essere difficili da individuare nei test. Inoltre, se si sta usando indulgente per tollerare variazioni nel formato temporale, si brucerà. Per esempio:
System.out.println(new SimpleDateFormat("yyyyMMdd").parse("2010-12-30"));
rendimenti questo (il fuso orario può variare):
Mon Nov 02 00:00:00 EST 2009
Questo risultato assurdo sembra essere la meno un mese ("-1"), secondo giorno ("2- ") del 2010. Il mese di zeroth è dicembre!
Sfortunatamente, l'utilizzo di setLenient (false) non conduce a un'interpretazione rigorosa del pattern. SimpleDateFormat tollera spazzatura seguendo il pattern match, come discusso qui:
SimpleDateFormat.parse() ignores the number of characters in pattern
Inoltre, non è rigorosa circa il numero di caratteri del modello, come ad esempio "d" al posto di "dd":
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/d");
sdf.setLenient(false);
System.out.println("For 5: " + sdf.parse("2010/01/5"));
System.out.println("For 05: " + sdf.parse("2010/01/05"));
System.out.println("For 15: " + sdf.parse("2010/01/15"));
Resa:
For 5: Tue Jan 05 00:00:00 EST 2010
For 05: Tue Jan 05 00:00:00 EST 2010
For 15: Fri Jan 15 00:00:00 EST 2010
anche con setLenient (false) "2010/01/05" è accettato con il modello "MM/dd yyyy /". E il disaccordo sui dati viene ignorato, come "1999/2011" con lo schema "yyyy/aaaa" (la risposta è il 2011).
L'utilizzo di SimpleDateFormat per convalidare le stringhe di data/ora è purtroppo inaffidabile. Se segui il link sopra vedrai alcune soluzioni, inclusa una versione più severa di SimpleDateFormat scritta da me!
FYI, 'DateFormat' è una delle classi fastidiosi scendere Data in tempo che ora sono l'eredità, soppiantato dalle classi java.time. Utilizzare ['java.time.format.DateTimeFormatter'] (https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html). –