2012-10-26 10 views
17

SimpleDateFormat è un parser molto gentile che registra la data risultante anziché generare un errore. Come posso analizzare una data rigorosamente senza espressioni regolari ecc.?Java: come analizzare rigorosamente una data?

fmt = new SimpleDateFormat("dd.MM.yyyy") 
fmt.parse("10.11.2012") // it works 
fmt.parse("10.1150.2012") // it works but it's unwanted 
+3

può o non può risolvere il tuo problema ma, se hai a che fare con date in Java, ti raccomando caldamente la libreria Joda Time – Eduardo

risposta

31

fmt.setLenient(false); è quello che stai cercando.

+6

Tristemente impostando il lenient false è ancora indulgente. "2010/01/5" è consentito per lo schema "aaaa/MM/gg". 20100901andGarbage "è consentito per il modello" yyyyMMdd ".Ho pubblicato una risposta che garantisce le corrispondenze rigorose utilizzando una classe che estende SimpleDateFormat. –

+0

Il documento di java.text.DateFormat.parse ha dichiarato" Il metodo non può utilizzare l'intero testo di la stringa data. – Germinate

9

java.time

È inoltre possibile utilizzare il java.time package in Java 8 e versioni successive (Tutorial). La sua analisi controlla rigorosamente i valori della data.

Ad esempio:

String strDate = "20091504"; 
TemporalAccessor ta = DateTimeFormatter.ofPattern("yyyyMMdd").parse(strDate); 

esprime direttamente:

Exception in thread "main" java.time.format.DateTimeParseException: 
Text '20091504' could not be parsed: 
Invalid value for MonthOfYear (valid values 1 - 12): 15 
+0

'DateTimeFormatter' ha tre stili di resolver (rispetto ai due di' DateFormat'): strict, smart e lenient. Fortunatamente smart è l'impostazione predefinita, cattura l'input più indesiderato e forse tutto ciò che è chiaramente errato: per una convalida ancora più severa, puoi ovviamente provare lo stile rigoroso del risolutore. [Documentatio] (http://docs.oracle.com/javase/8/docs/api/java/time/format/ResolverStyle.html) è piuttosto informativo –

2

Purtroppo fmt.setLenient (false); non otterrà la formattazione di data rigorosa. Ne aiuta alcuni, ad esempio l'analisi di "2010-09-01" utilizzando il formato "yyyyMMdd" avrà esito positivo se lenente == true, ma il risultato è molto bizzarro: 2009/12/09.

Anche se lenente == false parse() agisce ancora indulgente. "2010/01/5" è consentito per lo schema "aaaa/MM/gg". E il disaccordo sui dati come "1999/2011" per il modello "yyyy/aaaa" è tollerato (resa nel 2011). I rifiuti sono consentiti anche dopo la corrispondenza del modello. Ad esempio: "20100901" e "20100901andGarbage" corrisponderanno entrambi "aaaaMMgg".

Ho scritto un'estensione di SimpleDateFormat che applica la corrispondenza del modello rigorosa. Potete trovare qui:

SimpleDateFormat.parse() ignores the number of characters in pattern

Nel mio formato di versione() e parse() sono inverse funzionali. Questo è quello che penso che la maggior parte delle persone si aspetterebbe.

Problemi correlati