我正在尝试验证日期输入,如果日期和月份总是两位数,我只希望它们通过。到目前为止,我一直在使用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");
答案 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个数字(年份)。