繁体   English   中英

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

[英]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.SimpleDateFormatparse方法将字符串转换为日期,看看是否成功。

如果是这样(您得到一个有效的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM