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");
一种方式是验证输入,确保其符合期望格式,然后再解析它。
if (date.matches("\\d{2}/\\d{2}/\\d{4}")) {
SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
df.parse(date);
}
正则表达式比分割字符串和检查方式快吗? –
可读性或速度?如果你将字符串分割成'/'字符,你需要检查(a)字符串分成三部分,(b)每部分只包含数字,(c)前两部分是长度为2,第三部分的长度为4.正则表达式已经完成了所有这些工作,以简单,清晰,可读的if语句。如果速度是一个问题,那么正则表达式可以被编译一次并作为“最终静态匹配器”存储。 – AJNeufeld
如果我们谈论的是单行代码,那么我会比速度更可读性更关心速度,但对于只有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
“uuuu”和“yyyy”有什么区别? –
@JimmyP你为什么不看看[javadoc](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)并亲自看看? – Andreas
我做到了。在符号表中,两者具有相同的表示和示例,对Year的解释不区分它们。我看到的唯一差别是一个是“年”,另一个是“年代”,我不确定这意味着什么。 –
你可以使用[图案](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 -9] {2})/([0-9] {2})/([0-9] {4}) – dreamer
您是否正常工作? – ItamarG3