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

Java 为什么2010/08/15与M/d/yy匹配?,java,simpledateformat,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(

我有一个有效的日期格式数组,我想在用户输入的文本中检测:

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 datesFound=new ArrayList();
for(字符串标记:this.searchTokens){
日期;
用于(DateFormat DateFormat:DateHelper.DATE\u格式){
试一试{
//尝试将此令牌解析为日期。
date=(date)dateFormat.parse(token);
datesFound.add(日期);
打破
}捕获(解析异常){
持续
}
}
}
此代码验证任何日期的正确日期,并将其添加到my List对象中,格式如下的日期除外:

  • yyyy/MM/dd
  • yyyy.MM.dd
  • 年月日
在我的一个单元测试中,日期2010/08/15和2011/08/15第一次通过循环与M/d/yy匹配,并分别成为值为Jun 8、2182和Jul 8、2182的日期对象。为什么DATE_格式的第一个SimpleDataFormat会接受这样的匹配?数字的数量甚至不匹配。。。是否有更好的方法来检测这些日期?

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

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

调用
。在您创建的
SimpleDataFormat
对象上设置Lenient(false)


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

这对我很有效。单独使用.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;
     }
for(int i=0;i
这对我很有效。单独使用.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;
     }
for(int i=0;i