Нужна помощь с проверкой даты

#java #date #simpledateformat

#java #Дата #simpledateformat

Вопрос:

У меня есть приведенный ниже код, и он работает довольно хорошо, за исключением того, что если вы введете что-то вроде 2/2/2011, вы получите сообщение об ошибке «Дата документа не является допустимой датой». Я ожидал бы, что в нем будет сказано «Дата документа должна быть в формате ММ / ДД / ГГГГ».

Почему строка newDate = dateFormat.parse(date); не улавливает это?

 // checks to see if the document date entered is valid
    private String isValidDate(String date) {

        // set the date format as mm/dd/yyyy
        SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
        Date newDate = null;

        // make sure the date is in the correct format..        
        if(!date.equals("mm/dd/yyyy")) {
            try {
                newDate = dateFormat.parse(date);
            } catch(ParseException e) {
                return "The Document Date needs to be in the format MM/DD/YYYYn";
            }

            // make sure the date is a valid date..
            if(!dateFormat.format(newDate).toUpperCase().equals(date.toUpperCase())) {
                return "The Document Date is not a valid daten";
            }

            return "true";
        } else {
            return "- Document Daten";
        }
    }
  

РЕДАКТИРОВАТЬ: Я пытаюсь обеспечить строгое соблюдение формата ММ / ДД / ГГГГ. Как я могу изменить код, чтобы, если пользователь вводит «2/2/2011», отображалось сообщение: «Дата документа должна быть в формате ММ / ДД / ГГГГ»?

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

1. Большая часть этого кода не делает ничего полезного. Могу предоставить более простой пример вашего кода, поскольку у меня просто возникнет соблазн удалить большую его часть.

2. 2 это действительный год, поэтому я бы не ожидал, что он выдаст ошибку, и я бы ожидал, что он будет отформатирован в 02/02/0002 , что не совпадает с 2/2/2 тем, что даже 6/1/2011 не пройдет ваш тест.

3. Это должно было быть 2/2/2011. Я обновил его.

4. Это будет отформатировано так, 02/02/2011 как вы указали, поэтому оно не будет соответствовать.

5. Нет, этого не произойдет. Выдается сообщение «Дата документа не является допустимой датой». Я бы ожидал, что он выдаст сообщение «Дата документа должна быть в формате ММ / ДД / ГГГГ».

Ответ №1:

Как уже упоминалось, SimpleDateFormat способен анализировать «2/2/2011» так, как будто это «02/02/2011». поэтому не ParseException выдается.

С другой стороны, dateFormat.format(newDate) вернет «02/02/2011» и сравнивается с «2/2/2011». Две строки не равны, поэтому возвращается второе сообщение об ошибке.

setLenient(false) в этом случае не будет работать:

Месяц: если количество букв шаблона равно 3 или более, месяц интерпретируется как текст; в противном случае он интерпретируется как число.

Число: Для форматирования количество букв шаблона равно минимальному количеству цифр, а более короткие числа дополняются нулем до этого значения. Для синтаксического анализа количество букв шаблона игнорируется, если только это не необходимо для разделения двух смежных полей.

(источник: java docs)

вы можете использовать регулярное выражение для ручной проверки формата строки:

 if(date.matches("[0-9]{2}/[0-9]{2}/[0-9]{4}")) {
    // parse the date
} else {
    // error: wrong format
}
  

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

1. Это сработало. Должно быть, я не понял, что на самом деле сделал синтаксический анализ даты. Я думал, что он подтвердил, что он был в правильном формате.

2. К сожалению для вас, нет. Анализатор на самом деле довольно умный и распознает самые странные строки. я только что успешно проанализировал строку «0211111/021111111/201111111111» (при мягком разборе, при строгом разборе возникает исключение ParseException). Это хорошо для того, чтобы извлечь максимум пользы из искаженного пользовательского ввода, но очень плохо в вашем случае.

3. 1. Было бы неплохо, если бы в SimpleDateFormat документах было разъяснено снисходительное поведение самого SimpleDateFormat#parse() метода, поскольку он по существу заменяет (и, возможно, даже нарушает контракт с) документацию для DateFormat#parse() . То есть, если только моя интерпретация «строгого» (как задокументировано DateFormat#parse() ) не неверна.

4. я тоже предположил, что строгий синтаксический анализ… ну … строгий. похоже, что в этом контексте «строгий» означает «немного менее снисходительный, чем снисходительный». Я не смог найти определение того, в чем именно разница между мягким и строгим синтаксическим анализом, только примеры, подобные этой ссылке , и я отказался от попыток выяснить это путем экспериментов.

Ответ №2:

Дата указана правильно, но она будет отформатирована как 02/02/2002

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

1. Я знаю, что это так, вот в чем проблема. Я бы ожидал, что в сообщении об ошибке будет отображаться, каким должен быть формат, а не то, что это недопустимая дата.

2. если я правильно помню, дата даже 2 февраля во 2 году н.э., не так ли?

3. @Catfish: тогда вам нужно проверить строку с помощью регулярного выражения. если SimpleDateFormat способен анализировать строку, он просто делает это, не создавая исключения.

4. Ну, это сообщение об ошибке, которое вы возвращаете, а не то, которое генерирует исключение (исключение не генерируется)