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



我需要检查我的出生日期输入字段的值。应该有几种可能性:dd.MM.yyyydd.M.yyyyd.MM.yyyyd.m.yyyy以及dd.MM.yydd.M.yyd.MM.yyd.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.SimpleDateFormatparse方法将字符串转换为日期,看看它是否成功。

如果是(您得到一个有效的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字段执行相同的检查。

我还没有检查它是否编译,但你应该知道。

最新更新