对SimpleDateFormat进行严格的两位数日和月解析

时间:2016-12-15 17:41:24

标签: java validation date

我正在尝试验证日期输入,如果日期和月份总是两位数,我只希望它们通过。到目前为止,我一直在使用SimpleDateFormat:

    SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
    df.setLenient(false);

    try
    {
        df.parse("10/1/1987");
        df.parse("1/1/1987");
        df.parse("1/10/1987");
        df.parse("1/1/19");
    }

    catch (ParseException e)
    {
        e.printStackTrace();
    }

所有这些案件都已经过去了,我也不想让任何案件通过。

有没有一种简单的方法可以解决这个问题,或者我是否必须首先用反斜杠对字符串进行标记:

String[] dateParts = date.split("/");
if (dateParts.length != 3 && dateParts[0].length() != 2 && dateParts[1].length() != 2 && dateParts[2].length() != 4)
    System.out.println("Invalid date format");

3 个答案:

答案 0 :(得分:3)

改为使用新的java.time

public static void main(String[] args) {
    test("10/10/1987");
    test("10/1/1987");
    test("1/1/1987");
    test("1/10/1987");
    test("1/1/19");
}
private static void test(String date) {
    DateTimeFormatter fmt = DateTimeFormatter.ofPattern("MM/dd/uuuu");
    try {
        System.out.println(LocalDate.parse(date, fmt));
    } catch (Exception e) {
        System.out.println(e);
    }
}

输出

1987-10-10
java.time.format.DateTimeParseException: Text '10/1/1987' could not be parsed at index 3
java.time.format.DateTimeParseException: Text '1/1/1987' could not be parsed at index 0
java.time.format.DateTimeParseException: Text '1/10/1987' could not be parsed at index 0
java.time.format.DateTimeParseException: Text '1/1/19' could not be parsed at index 0

答案 1 :(得分:1)

一种方法是验证输入,确保它在解析之前匹配所需的格式。

if (date.matches("\\d{2}/\\d{2}/\\d{4}")) {
    SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
    df.parse(date);
}

答案 2 :(得分:1)

您可以使用正则表达式

String regex = "(\\d{2})\\/(\\d{2})\\/(\\d{2,4})$";
Pattern p = Pattern.compile(regex);
String input = "10/12/1987";
Matcher m = p.matcher(input);
while (m.find()) {
    //if it got here, then the date is in the right format
    System.out.println(m.group(0));
}

模式检查2位数(\\d{2}匹配数字,正好2次),然后是斜杠(\/),然后是2位数,然后再次斜杠,然后2 -4个数字(年份)。