SimpleDateFormat严格的两位数的日期和月份解析

问题描述:

我想验证日期输入,我只希望他们通过如果日和月总是两位数。到目前为止,我一直在用的SimpleDateFormat这样做: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"); 
+2

你可以使用[图案](https://docs.oracle.com/javase/7/docs/ api/java/util/regex/Pattern.html)[Matcher](https://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html),并匹配相应的常规表达...例如'“\ d {2}/\ d {2}/\ d {4}”'。例如)'if(date.matches(“\\ d {2}/\\ d {2}/\\ d {4}”)){...}' – AJNeufeld

+0

您可以使用正则表达式,例如([0 -9] {2})/([0-9] {2})/([0-9] {4}) – dreamer

+0

您是否正常工作? – ItamarG3

一种方式是验证输入,确保其符合期望格式,然后再解析它。

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

正则表达式比分割字符串和检查方式快吗? –

+0

可读性或速度?如果你将字符串分割成'/'字符,你需要检查(a)字符串分成三部分,(b)每部分只包含数字,(c)前两部分是长度为2,第三部分的长度为4.正则表达式已经完成了所有这些工作,以简单,清晰,可读的if语句。如果速度是一个问题,那么正则表达式可以被编译一次并作为“最终静态匹配器”存储。 – AJNeufeld

+0

如果我们谈论的是单行代码,那么我会比速度更可读性更关心速度,但对于只有10个字符的字符串它真的很重要吗? –

您可以使用正则表达式,

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个数字(年份)。

使用新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 
+0

“uuuu”和“yyyy”有什么区别? –

+0

@JimmyP你为什么不看看[javadoc](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)并亲自看看? – Andreas

+1

我做到了。在符号表中,两者具有相同的表示和示例,对Year的解释不区分它们。我看到的唯一差别是一个是“年”,另一个是“年代”,我不确定这意味着什么。 –