Есть ли хороший * строгий * анализатор даты для Java? - PullRequest
11 голосов
/ 29 января 2009

Есть ли хороший, строгий анализатор даты для Java? У меня есть доступ к Joda-Time, но я еще не видел эту опцию. Я нашел вопрос «Есть ли хороший анализатор дат для Java?», И хотя это связано, это как бы наоборот. В то время как этот вопрос требовал более мягкой, нечеткой логики и склонности к человеческому анализатору ошибок, я бы хотел строгий анализатор. Например, с JodaTime (насколько я могу судить) и simpleDateFormat, если у вас есть формат «MM / dd / yyyy»:

разобрать это: 40/40/4353

Это становится действительной датой. Я хочу парсер, который знает, что 40 - недопустимый месяц и дата. Конечно, какая-то реализация этого существует в Java?

Ответы [ 3 ]

21 голосов
/ 29 января 2009

Я не вижу, чтобы Йода признавала это действительной датой. Пример:

strict = org.joda.time.format.DateTimeFormat.forPattern("MM/dd/yyyy")
try {
    strict.parseDateTime('40/40/4353')
    assert false
} catch (org.joda.time.IllegalFieldValueException e) {
    assert 'Cannot parse "40/40/4353": Value 40 for monthOfYear must be in the range [1,12]' == e.message
}



Насколько я могу судить, ни DateFormat , ни setLenient (false) не работают. Пример:

try {
    df = new java.text.SimpleDateFormat('MM/dd/yyyy')
    df.setLenient(false)
    df.parse('40/40/4353')
    assert false
} catch (java.text.ParseException e) {
    assert e.message =~ 'Unparseable'
}

Надеюсь, это поможет!

11 голосов
/ 01 марта 2010

Хороший способ выполнить строгую проверку с помощью DateFormat - переформатировать проанализированную дату и проверить равенство исходной строке:

String myDateString = "87/88/9999";
Date myDate = dateFormat.parse(myDateString);
if (!myDateString.equals(df.format(myDate))){
  throw new ParseException();
}

Работает как шарм.

0 голосов
/ 26 апреля 2019

Вы можете использовать apache.commons.validator.routines.DateValidator для проверки даты, если вы не хотите использовать SimpleDateFormat.

Пример:

 public static Date validateDate(String value, String pattern) {
       DateValidator validator = new DateValidator();
       Date date = null;
           if (pattern!=null) {    //Pattern is passed
               date = validator.validate(value, pattern);
           } else {
               date = validator.validate(value);
           }
       return date;
    }

Таким образом, если null возвращается , это означает, что дата недействительна, в противном случае это действительная дата. Этот метод является альтернативой использованию SimpleDateFormat, так как вам не нужно полагаться на исключение брошенный, чтобы определить, является ли это действительной датой или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...