Разбор дат в Java

Рубрика: Java, Юмор | 23 August 2007, 10:32 | juriy

Как известно, самый простой способ проверить в 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. Интересно, это баг или фича?

Напоследок, улыбнуло:

feature

Комментариев: 8

8 Responses to “Разбор дат в Java”

Комментарии:

  1. vadim

    Юра,
    “Это не баг – это фича”
    Попробуй так:
    [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

  2. Juriy

    Не надо так извращаться, достаточно

    [code]
    DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
    dateFormat.setLenient(false);
    System.out.println(dateFormat.format(dateFormat.parse("40.40.2000")));
    [/code]

    Мне уже самому интересно стало :-).

    Еще одна задачка для любителей проверять “глубокие познания в API”.

  3. vadim

    Таки да – недоглядел.

  4. E][P1oReR

    А что интересного то!)))
    Смотрите
    у вас 40 дней, 40 месяцев и 2000 год.
    А теперь делаем так=))
    максимум 31 день -> 10 дней в память на старший разряд переносим=)
    40 месяцев это что?:) это 3 года + 4 месяца-> 2000+3 -> 2003 год
    Что у нас остается?:)
    4 месяца + 10 дней в памяти.
    Оттого имеем 10.05.2003

  5. Topmp

    вариант от Juriy респект!

  6. Insomnium

    Как раз бьюсь над этой проблемой уже 2 часа. Juriy, огромное вам спасибо!)

  7. Lem

    Не соглашусь с Вами…. Вариант, предложенный Juriy, такой же несовершенный, как проверка регулярным выражением. Алгоритм не делает главного – не проверяет дату на существование.
    31 февраля не существует, а 29 бывает раз в 4 года.

  8. Harout

    Juriy спасибо тебе огромное премного благодарен )))

Leave a Reply