SimpleDateFormat дает неправильную дату вместо ошибки - PullRequest
7 голосов
/ 17 мая 2011

Я использую следующую схему и дату

Дата: 13-13-2007

Выкройка: дд-мм-гггг

Выход: вс 13 января 00:00:00 IST 2008 Или же 2008-01-13 00: 00: 00.0

Я ожидал исключения здесь. Что я могу сделать, чтобы сгенерировать исключение, если указанная дата не соответствует действительности.

Ответы [ 3 ]

14 голосов
/ 17 мая 2011

Используйте DateFormat.setLenient(false), чтобы сообщить DateFormat / SimpleDateFormat, что вы хотите, чтобы он был строгим.

3 голосов
/ 06 марта 2019

java.time

Я хотел бы дать современный ответ.Когда этот вопрос был задан в 2011 году, было разумно использовать SimpleDateFormat и Date.Это больше неЭти классы всегда были плохо спроектированы и были заменены на java.time, современный Java-API даты и времени, в 2014 году, поэтому они давно устарели.

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MM-uuuu");

    String dateString = "13-13-2007";
    LocalDate date = LocalDate.parse(dateString, dateFormatter);

Этот код дает ожидаемое вами исключение (иимел вескую причину ожидать):

Исключение в потоке "main" java.time.format.DateTimeParseException: текст '13 -13-2007 'не может быть проанализирован: недопустимое значение для MonthOfYear (допустимые значения1 - 12): 13

Также обратите внимание и получите точное и информативное сообщение об исключении.

DateTimeFormatter имеет три так называемых стиля распознавателя: строгий, умный и снисходительный.Умный по умолчанию, и вам редко понадобится что-нибудь еще.Используйте строгий режим, если вы хотите быть уверенным в том, что при любых обстоятельствах все недопустимые даты будут фиксироваться.

Ссылки

3 голосов
/ 04 августа 2014

Установить Lenient будет работать в большинстве случаев, но если вы хотите проверить точный шаблон строки, тогда это может помочь,

    String s = "03/6/1988";
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    try {
        sdf.setLenient(false);
        Date d = sdf.parse(s);
        String s1 = sdf.format(d);
        if (s1.equals(s))
            System.out.println("Valid");
        else
            System.out.println("Invalid");
    } catch (ParseException ex) {
        // TODO Auto-generated catch block
        ex.printStackTrace();
    }

Если вы введете «03/06/1988», то выполучить действительный результат.

...