为什么2010/08/15与M / d / yy匹配?

时间:2011-11-01 17:40:40

标签: java simpledateformat

我想要在用户输入的某些文本中检测到一系列有效的日期格式:

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 / MM / DD
  • YYYY.MM.DD
  • YYYY-MM-DD

在我的一个单元测试中,2010/08/15和2011/08/15的日期在第一次循环时与M / d / yy匹配,并成为Date对象,其值为Jun 8,2182和7月8日,分别是2182年。为什么DATE_FORMATS中的第一个SimpleDateFormat会接受这样的匹配?数字位数甚至不匹配......我应该更好地检测这些日期吗?

2 个答案:

答案 0 :(得分:3)

在您创建的.setLenient(false)对象上调用SimpleDateFormat

我认为M和MM仍然会匹配1或2位数。我想如果那不是你想要的话,你必须自己检查(使用正则表达式)。

答案 1 :(得分:0)

这对我有用。单独使用.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;
     }