我有一组有效的日期格式,我想在用户输入的一些文本中检测:
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;
}
}
}
此代码验证任何日期的正确日期并将正确的日期添加到我的列表对象中,但格式如下的日期除外:
- 年/月/日
- yyyy.MM.dd
- 年月月日
在我的一个单元测试中,日期 2010/08/15 和 2011/08/15 第一次通过循环与 M/d/yy 匹配,并成为值为 Jun 8、2182 和 Jul 8 的 Date 对象, 2182, 分别。为什么 DATE_FORMATS 中的第一个 SimpleDateFormat 会接受这样的匹配?位数甚至不匹配...是否有更好的方法来检测这些日期?
最佳答案
在您创建的 SimpleDateFormat
对象上调用 .setLenient(false)
。
我认为 M 和 MM 仍然会匹配 1 或 2 个数字。如果这不是您想要的,我认为您必须自己检查(使用正则表达式)。
关于java - 为什么 2010/08/15 与 M/d/yy 匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7970470/