我想要在用户输入的某些文本中检测到一系列有效的日期格式:
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对象添加正确的日期,除了日期格式如此之外的任何日期:
在我的一个单元测试中,2010/08/15和2011/08/15的日期在第一次循环时与M / d / yy匹配,并成为Date对象,其值为Jun 8,2182和7月8日,分别是2182年。为什么DATE_FORMATS中的第一个SimpleDateFormat会接受这样的匹配?数字位数甚至不匹配......我应该更好地检测这些日期吗?
答案 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;
}