Есть ли хороший * строгий* анализатор дат для Java?

StackOverflow https://stackoverflow.com/questions/489538

  •  20-08-2019
  •  | 
  •  

Вопрос

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

проанализируйте это:40/40/4353

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

Это было полезно?

Решение

Я этого не вижу Джода распознает это как действительную дату.Пример:

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
}



Насколько я могу судить, ни то, ни другое Формат даты с setLenient(ложь).Пример:

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'
}

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

Другие советы

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

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

Работает как заклинание.

Вы можете использовать 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;
    }

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top