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

标签 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;
            }
        }
    }

此代码验证任何日期的正确日期并将正确的日期添加到我的列表对象中,但格式如下的日期除外:

  • 年/月/日
  • 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/

相关文章:

java - 在 java 中转换 UTC 时间时出现无法解析的日期异常

Java解析 "Thu Jun 09 2016 00:00:00 GMT+0200 (CEST)"

java - 将用户输入日期与当前日期进行比较

Java grpc 运行时错误

java - SendKeys 不会填充 Internet Explorer 中相应组件中的值,但在 Chrome 中却可以

java - 这与 firestore 读取请求有关。 Firestore 在 Android 应用程序中实现

Java SimpleDateFormat 剪切 SSS 的尾随 0 位

java - 防止 Java 中的跨站请求伪造 (CSRF) 攻击

java - 如何使用 selenium Webdriver 单击单选按钮?

日期范围的 Java 掩码格式