2009-12-15 4 views
40

Sto utilizzando java.text.SimpleDateFormat per analizzare stringhe del modulo "yyyyMMdd".Rendere SimpleDateFormat.parse() non valido per le date non valide (ad esempio mese è maggiore di 12)

Se provo a analizzare una stringa con un mese maggiore di 12, anziché fallire, si sposta verso l'anno successivo. Pieno Repro eseguibile:

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class ParseDateTest { 

    public static void main(String[] args) throws ParseException { 

     SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); 
     Date result = format.parse("20091504"); // <- should not be a valid date! 
     System.out.println(result); // prints Thu Mar 04 00:00:00 CST 2010 
    } 
} 

avrei preferito un ParseException gettato.

Esiste un modo non hacky per forzare l'eccezione a verificarsi ?. Voglio dire, non voglio controllare manualmente se il mese è maggiore di 12. Questo è un po 'ridicolo.

Grazie per qualsiasi suggerimento.

NOTA: Conosco già Joda Time, ma ho bisogno di farlo in JDK semplice senza librerie esterne.

risposta

96

È necessario farlo non-lenient. Quindi,

format.setLenient(false); 

dovrebbe farlo.

+6

Grazie mille. Questo ha fatto il trucco. Incredibile come fare domande qui dà risultati più veloci della ricerca su google (o faccio schifo alla ricerca :). –

+2

+1 per l'unico rivestimento. Lo stackoverflow –

+2

dovrebbe consentire agli utenti di fornire più di 1 punto alle risposte e questa è una di quelle risposte. Stavo facendo qualche ridicola corrispondenza di pattern prima di analizzare con 'SimpleDateFormat'. Molte grazie. –

3

È possibile utilizzare l'API Java 8 time. Se per esempio si utilizza un mese con un valore di 15:

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

Avrete direttamente avere un'eccezione

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