Почему 2010/08/15 соответствует M / d / yy? - PullRequest
1 голос
/ 01 ноября 2011

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

public static final DateFormat[] DATE_FORMATS = {
    new SimpleDateFormat("M/d/yy"),
    new SimpleDateFormat("M.d.yy"),
    new SimpleDateFormat("M-d-yy"),
    new SimpleDateFormat("M/d/yyyy"),
    new SimpleDateFormat("M.d.yyyy"),
    new SimpleDateFormat("M-d-yyyy"),
    new SimpleDateFormat("M/dd/yy"),
    new SimpleDateFormat("M.dd.yy"),
    new SimpleDateFormat("M-dd-yy"),
    new SimpleDateFormat("M/dd/yyyy"),
    new SimpleDateFormat("M.dd.yyyy"),
    new SimpleDateFormat("M-dd-yyyy"),
    new SimpleDateFormat("MM/d/yy"),
    new SimpleDateFormat("MM.d.yy"),
    new SimpleDateFormat("MM-d-yy"),
    new SimpleDateFormat("MM/d/yyyy"),
    new SimpleDateFormat("MM.d.yyyy"),
    new SimpleDateFormat("MM-d-yyyy"),
    new SimpleDateFormat("MM/dd/yy"),
    new SimpleDateFormat("MM.dd.yy"),
    new SimpleDateFormat("MM-dd-yy"),
    new SimpleDateFormat("MM/dd/yyyy"),
    new SimpleDateFormat("MM.dd.yyyy"),
    new SimpleDateFormat("MM-dd-yyyy"),
    new SimpleDateFormat("yyyy/MM/dd"),
    new SimpleDateFormat("yyyy.MM.dd"),
    new SimpleDateFormat("yyyy-MM-dd")
};

Даты определяются с помощью кода ниже. this.searchTokens - это массив каждого поискового запроса из введенного пользователем текста.

    List<Date> datesFound = new ArrayList<Date>();

    for (String token : this.searchTokens) {

        Date date;

        for (DateFormat dateFormat : DateHelper.DATE_FORMATS) {
            try {
                // Attempt to parse this token as a date.
                date = (Date) dateFormat.parse(token);
                datesFound.add(date);
                break;
            } catch (ParseException e) {
                continue;
            }
        }
    }

Этот код проверяет и добавляет правильные даты в мой объект List для любой даты, кроме дат, отформатированных следующим образом:

  • YYYY / ММ / дд
  • YYYY.MM.DD
  • YYYY-MM-дд

В одном из моих модульных тестов даты 2010/08/15 и 2011/08/15 соответствуют M / d / yy в первый раз в цикле и становятся объектами Date со значениями 8 июня 2182 и 8 июля 2182 соответственно. Почему первый SimpleDateFormat в DATE_FORMATS принимает такое совпадение? Количество цифр даже не совпадает ... Есть ли лучший способ определить эти даты?

Ответы [ 2 ]

3 голосов
/ 01 ноября 2011

Вызовите .setLenient(false) на SimpleDateFormat объекте, который вы создали.

Я думаю, что М и ММ все равно будут совпадать с 1 или 2 цифрами. Я думаю, вы должны проверить это сами (с помощью регулярных выражений), если это не то, что вы хотите.

0 голосов
/ 08 марта 2013

Это сработало для меня. Использование .setLenient (false) само по себе не решило проблему.

for(int i=0; i < PropDateFormats.length; i++)
{
    try
    {   
    ParsePosition p = new ParsePosition(0);
    PropDateFormats[i].setLenient(false);
        PropagationDate = PropDateFormats[i].parse(_date,p);
    if(p.getIndex() < _date.length())
    {
        log.trace("setPropagationDate.parse("+_date+") failed. Index=["+i+"[ as"+PropagationDate);
    throw new ParseException(_date, p.getIndex());
     }
         log.trace("setPropagationDate.parse("+_date+") passed. Index=["+i+"[  as"+PropagationDate);
          break;
     }
...