[英]jsf - validate date with expression language
我需要检查我的生日输入字段的值。 应该有几种可能性: dd.MM.yyyy
, dd.M.yyyy
, d.MM.yyyy
, dmyyyy
以及dd.MM.yy
, dd.M.yy
, d.MM.yy
, dmyy
。 例如,您可以输入 07.03.1993、7.3.93 或其他任何内容。
以下正则表达式示例仅检查格式验证,但不检查日期是否存在(例如 29.02.2011 或 47.02.2011 将被允许)
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");
}
编辑:我刚刚创建了以下正则表达式语句,现在它检查月份是否大于 12 以及日期是否大于 31。我想我应该先使用正则表达式,然后使用SimpleDateFormat
验证日期
String s = "^((0?[1-9]|[12][0-9]|3[01])\\.(0?[1-9]|1[012])\\.((19|20)\\d{2})$";
如果正则表达式不是必须的,您可以尝试使用java.text.SimpleDateFormat
的parse
方法将字符串转换为日期,看看是否成功。
如果是这样(您得到一个有效的Date
对象),那么您在表单(或输入)中输入了一个有效日期。 如果不成功,则parse
function 返回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
字段进行相同的检查。
我还没有检查这是否编译,但你应该明白了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.