【问题标题】:Use SimpleDateFormat to validate a date使用 SimpleDateFormat 验证日期
【发布时间】:2012-10-11 14:42:15
【问题描述】:

我想创建一个使用SimpleDateFormat 来验证日期的方法。

如果日期有效(例如02/09/20122/09/201202/9/2012),此方法应返回true

但是如果日期的格式错误(例如02/09/201X)或逻辑错误(例如32/09/2012),这个方法应该返回false

我尝试这样写这个方法:

private boolean isValidDate(String date) {
        DateFormat df1 = new SimpleDateFormat("dd-MM-yyyy");
        DateFormat df2 = new SimpleDateFormat("d-MM-yyyy");
        DateFormat df3 = new SimpleDateFormat("dd-M-yyyy");
        Date d = null;
        String s = null;

        try {
            d = df1.parse(date);
        }catch (Exception e1) {
            try{
                d = df2.parse(date);
            }catch (Exception e2) {
                try {
                    d= df3.parse(date);
                }catch (Exception e3) {
                    return false;
                }
                s = df3.format(d);
                return date.equals(s);
            }
            s = df2.format(d);
            return date.equals(s);
        }
        s = df1.format(d);
        return date.equals(s);
    }

但如果我验证一个日期,例如 2/09/2012,它会返回 false(实际上它应该返回 true)。我不知道为什么......谁能找到我的代码有什么问题,或者这个逻辑完全错误?有没有更好的方法来做这个验证?

【问题讨论】:

  • 您应该考虑使用 java.xml.DatatypeFactory 来解析日期字符串。它速度快,支持大量标准格式。

标签: java validation date simpledateformat


【解决方案1】:

您的输入格式为 2/09/2012 而不是 2-09-2012,因此您的日期格式应如下所示:

    DateFormat df1 = new SimpleDateFormat("dd/MM/yyyy");
    DateFormat df2 = new SimpleDateFormat("d/MM/yyyy");
    DateFormat df3 = new SimpleDateFormat("dd/M/yyyy");

【讨论】:

    【解决方案2】:

    我认为您的代码很好(但不是非常可扩展 - 尝试在 for 循环中执行,以防您稍后添加更多格式)。

    问题是您的格式字符串错误。而不是dd-MM-yyyy,你应该有dd/MM/yyyy。其他格式也是如此:

    DateFormat df1 = new SimpleDateFormat("dd/MM/yyyy");
    DateFormat df2 = new SimpleDateFormat("d/MM/yyyy");
    DateFormat df3 = new SimpleDateFormat("dd/M/yyyy");
    

    【讨论】:

    • 谢谢你的建议,我发现使用setLenient(false)会缩短代码,因为我不需要比较date.equals(s)...
    【解决方案3】:

    验证失败,因为/ 不是-

    【讨论】:

      【解决方案4】:

      在解析每个字符串后添加这个额外的检查:

      1. 标记日期字符串的值
      2. 然后使用提取的日、月和年值,使用 GregorianCalendar 创建一个新的 Date 对象
      3. 将此与您通过解析日期字符串创建的日期对象进行比较
      4. 如果它们匹配,则您知道输入字符串包含有效的日期格式

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-25
        • 2012-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多