2016-01-07 6 views
1

GregorianCalendar конструктора есть подпись:Создает ли конструктор GregorianCalendar недопустимый ввод?

GregorianCalendar(int year, int month, int dayOfMonth) 
GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute, int second) 

Что произойдет, если я прохожу month или dayOfMonth из договора конструктора?

Легко проверить, существует ли месяц в диапазоне 0-11. Но невозможно проверить действительный день (который должен быть 28/28/30/31?) Без написания собственной реализации Календаря.

Должно быть хорошо, если Java Platform проверяет ввод данных пользователя. Мне не нравится проверять, действительно ли 2015-13-32 дата ISO в собственном коде.

+0

Что происходит? Ну, попробуй и узнай. – Draco18s

+0

Ничего не происходит, но это не помогает. Поскольку официальные документы ничего не говорят по теме, я задаю вопрос. – gavenkoa

ответ

2

Конструктор не проверяет, что вы можете сделать, это установить время после выполнения setLenient (ложь), которая сделает календарь принимать только действительные значения:

Calendar cal = Calendar.getInstance(); 
cal.setLenient(false); 
cal.set(2016, Calendar.FEBRUARY, 30); 
System.out.println(new SimpleDateFormat("dd/MM/yyyy").format(cal.getTime())); 

Этот пример будет сгенерировано исключение потому что 02/30/2016 не является допустимой датой (исключение составляет cal.getTime()).

+0

Я ожидаю такой ответ)) http://stackoverflow.com/questions/226910/how-to-sanity-check-a-date-in-java – gavenkoa

+0

Чтобы было ясно, какое выражение выбрало исключение? 'cal.set()' или 'cal.getTime()' или 'SimpleDateFormat.format()'? – gavenkoa

+1

Хорошая точка, на самом деле, что вызывает исключение: 'cal.getTime()' –

Смежные вопросы