jsf - 用表达式语言验证日期

时间:2012-04-04 07:42:35

标签: java regex validation

我需要检查生日输入字段的值。应该有以下几种可能性:dd.MM.yyyydd.M.yyyyd.MM.yyyyd.m.yyyy以及dd.MM.yydd.M.yyd.MM.yy,{ {1}}。例如,您可以输入07.03.1993,7.3.93或其他任何内容。

以下正则表达式示例仅检查格式验证,但不检查日期是否存在(例如,将允许29.02.2011或47.02.2011)

d.m.yy

编辑:我刚刚创建了以下正则表达式语句,现在检查月份是否大于12且日期大于31.我认为我应该首先使用正则表达式,然后使用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"); } <验证日期/ p>

SimpleDateFormat

2 个答案:

答案 0 :(得分:2)

如果必须使用正则表达式,您可以尝试使用parse java.text.SimpleDateFormat方法将字符串转换为日期,看看是否成功。

如果是(您获得有效的Date对象),则表单(或输入)中输入了有效日期。如果不成功,parse函数将返回null,并且您输入的String无效。

Hereparse方法的javadoc。

编辑:如果您不想使用setLenient进行额外验证,可以使用Date获得的parse并将其转换为String使用相同的格式。然后,只需将转化产生的String与您提供的产品作为输入进行比较。如果匹配,您就获得了有效的输入。

答案 1 :(得分:0)

您可以拆分它以获取日期的日期和月份。

然后你可以做类似的事情:

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字段进行相同的检查。

我没有检查过这是否会编译,但你应该明白这一点。