2013-07-02 14 views
7

Desidero utilizzare il metodo dei calendari per impostare la data e il mese dell'anno, ma desidero qualche tipo di indicazione se la data non è valida, ad es.Verifica se la data è valida utilizzando il calendario

calendar.set(2013,Calendar.JANUARY , 23) //is a valid date 
calendar.set(2013,Calendar.JANUARY , 33) //is not 

ho impostato calendar.setLenient(false) e aspettavo che l'impostazione del valore al gennaio 33rd sarebbe un'eccezione, ma non lo feci.

risposta

8

Sembra che il controllo viene eseguito pigramente:

Un non-indulgente GregorianCalendar genera un'eccezione su calcolo suoi valori di tempo o campo calendario se qualsiasi valore di campo out-of-range è stato impostato.

Quindi questo sarà gettare un'eccezione:

Calendar c = new GregorianCalendar(); 
c.setLenient(false); 
c.set(2013, Calendar.JANUARY, 33); 
c.getTime(); 

Ma non senza il getTime.

+0

+1 Esattamente. Solo uno dei tanti motivi per cui Calendar è la classe più danneggiata del JDK. (Usa JodaTime!) – Bohemian

3

Il trattamento si limita a controllare se il calendario accetta o meno date fuori intervallo. Se è impostata la clemenza, Java eseguirà alcuni calcoli per regolare le date fuori intervallo (ad esempio, 2013-12-32 diventa 2014-01-01). Se la clemenza non è impostata, Java non lo consentirà, ma non controllerà i dati fuori intervallo finché non richiedi effettivamente alcuni campi. Dal Javadocs:

Un non-indulgente GregorianCalendar genera un'eccezione su calcolo suoi valori di tempo o campo calendario se qualsiasi valore di campo out-of-range è stato impostato.

alla tua domanda,:

Come faccio a gestire questa situazione?

È possibile impostare il calendario al primo giorno del mese:

calendar.set(2013, Calendar.JANUARY, 1); 

e quindi richiamare

int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); 

e confrontare con il valore del giorno. Se il valore del giorno è compreso nell'intervallo, puoi procedere.

Problemi correlati