2013-07-02 14 views
7

Chcę użyć metody kalendarzy do ustawiania daty i miesiąca roku, ale chcę czegoś w rodzaju wskazania, jeśli data jest nieprawidłowa, np.Sprawdzanie, czy data jest ważna za pomocą Kalendarza

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

ustawić calendar.setLenient(false) i oczekuje się, że ustawienie wartości do 33. stycznia będzie wyjątek, ale tak się nie stało.

Odpowiedz

8

Wydaje się, że kontrola odbywa się leniwie:

Non-pobłażliwy kalendarz gregoriański zgłasza wyjątek momencie obliczania jego czas lub pól kalendarz wartości, jeśli jakakolwiek wartość poza zasięgiem pola został ustawiony.

Więc to będzie rzucić wyjątek:

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

lecz nie bez getTime.

+0

+1 Dokładnie w prawo. To tylko jeden z wielu powodów, dla których Kalendarz jest najbardziej zepsutą klasą w JDK. (Użyj JodaTime!) – Bohemian

3

Leniency kontroluje tylko to, czy kalendarz akceptuje daty poza zakresem. Jeśli ustawisz leniency, Java zrobi trochę matematyki, aby dostosować daty poza zakresem (na przykład, 2013-12-32 staje się 2014-01-01). Jeśli leniency nie zostanie ustawione, Java nie pozwoli na to, ale nie sprawdza danych poza zakresem, dopóki faktycznie nie zażądasz niektórych pól. Z Javadocs:

Non-łagodny kalendarz gregoriański zgłasza wyjątek momencie obliczania jego czas lub kalendarza polowe wartości jeśli wartość poza zakresem pola został ustawiony.

Aby twoje pytanie to:

Jak mam sobie z tym poradzić?

Można ustawić kalendarz do pierwszego dnia miesiąca:

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

a następnie powołać

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

i porównać przeciwko swojej wartości dziennie. Jeśli wartość dnia jest w zasięgu, możesz kontynuować.

Powiązane problemy