我需要检查我的出生日期输入字段的值。应该有几种可能性:dd.MM.yyyy
、dd.M.yyyy
、d.MM.yyyy
、d.m.yyyy
以及dd.MM.yy
、dd.M.yy
、d.MM.yy
、d.m.yy
。例如,您可以输入07.03.1993、7.3.93或其他内容。
下面的正则表达式示例只检查格式验证,但不检查日期是否存在(例如,允许2011年2月29日或2011年2日47时)
String s = (String) arg2;
String pattern = "^(\d{2}|\d{1})\.(\d{2}|\d{1})\.(\d{2}|\d{4})$";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(s);
if (m.matches()) {
System.out.println(("date correct"));
} else {
System.out.println("date incorrect");
}
edit:我刚刚创建了下面的regex语句,现在它检查月份是否大于12,日期是否大于31。我想我应该先使用regex,然后用SimpleDateFormat
验证日期
String s = "^((0?[1-9]|[12][0-9]|3[01])\.(0?[1-9]|1[012])\.((19|20)\d{2})$";
如果regex不是必须的,您可以尝试使用java.text.SimpleDateFormat
的parse
方法将字符串转换为日期,看看它是否成功。
如果是(您得到一个有效的Date
对象),则在您的表单(或输入)中输入了一个有效日期。如果不成功,parse
函数将返回null
,并且您输入的String
无效。
以下是parse
方法的javadoc。
编辑:为了在您不想使用setLenient
的情况下进行额外验证,您可以使用从parse
获得的Date
,并使用相同的格式将其转换回String
。然后,只需将转换后的String
与您提供的输入进行比较。如果它们匹配,则您得到了有效的输入。
您可以将其拆分以获得日期的日期和月份部分。
然后你可以做一些类似的事情:
final int dayToCheck = 32; // user input
final int month = 2; // user input
final int year = 1981; // user input
final Calendar cal = Calendar.getInstance();
cal.set(year, month, 1); // day doesn't need to be the user input, it can be any day in the month you want to check
if (cal.getActualMaximum(Calendar.DAY_OF_MONTH) > dayToCheck) {
// the day is invalid
}
if (cal.getActualMinimum(Calendar.DAY_OF_MONTH) < dayToCheck) {
// again, the day is invalid
}
您可以使用Calendar.MONTH
字段执行相同的检查。
我还没有检查它是否编译,但你应该知道。