#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. Ну, это сообщение об ошибке, которое вы возвращаете, а не то, которое генерирует исключение (исключение не генерируется)