Нужна помощь с подтверждением даты - PullRequest
3 голосов
/ 02 июня 2011

У меня есть код ниже, и он работает довольно хорошо, за исключением того, что если вы введете что-то вроде 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/YYYY\n";
            }

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

            return "true";
        } else {
            return "- Document Date\n";
        }
    }

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

Ответы [ 2 ]

4 голосов
/ 02 июня 2011

Как уже упоминалось, SimpleDateFormat может анализировать "02.02.2011", как если бы это было "02.02.2011".поэтому ParseException не выдается.

С другой стороны, dateFormat.format(newDate) вернет "02.02.2011" и сравнивается с "02.02.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
}
0 голосов
/ 02 июня 2011

Дата правильная, но она будет отформатирована 02.02.2002

...