Как известно, самый простой способ проверить в Java возможность выполнения некоторой операции, это попробовать ее выполнить в блоке try-catch и посмотреть что будет. До недавнего времени я использовал эту нехитрую методику для проверки корректности даты, записанной в виде строки. Получался приблизительно такой код:
[java]
try {
DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
dateFormat.parse("01.08.2007");
} catch (ParseException e) {
// Дата введена некорректно
}
[/java]
Каково же было мое удивление, когда абсолютно безобидная с виду дата: “40.40.2000″ отлично пропарсилась ;) Попробуйте, если интересно, исполнить у себя такой код:
[java]
try {
DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
System.out.println(dateFormat.format(dateFormat.parse("40.40.2000")));
} catch (ParseException e) {
}
[/java]
У меня в консоли: 10.05.2003. Интересно, это баг или фича?
Напоследок, улыбнуло:


Юра,
“Это не баг – это фича”
Попробуй так:
[java]
import java.text.* DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy"); Calendar cal = dateFormat.getCalendar(); cal.setLenient(false); dateFormat.setCalendar(cal); System.out.println(dateFormat.format(dateFormat.parse("40.40.2000")));[/java]
http://bugs.sun.com/view_bug.do?bug_id=4880502
Не надо так извращаться, достаточно
[code]
DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
dateFormat.setLenient(false);
System.out.println(dateFormat.format(dateFormat.parse("40.40.2000")));
[/code]
Мне уже самому интересно стало :-).
Еще одна задачка для любителей проверять “глубокие познания в API”.
Таки да – недоглядел.
А что интересного то!)))
Смотрите
у вас 40 дней, 40 месяцев и 2000 год.
А теперь делаем так=))
максимум 31 день -> 10 дней в память на старший разряд переносим=)
40 месяцев это что?:) это 3 года + 4 месяца-> 2000+3 -> 2003 год
Что у нас остается?:)
4 месяца + 10 дней в памяти.
Оттого имеем 10.05.2003
вариант от Juriy респект!
Как раз бьюсь над этой проблемой уже 2 часа. Juriy, огромное вам спасибо!)