Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jsf-使用表达式语言验证日期_Java_Regex_Validation - Fatal编程技术网

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

Java jsf-使用表达式语言验证日期,java,regex,validation,Java,Regex,Validation,我需要检查我的生日输入字段的值。应该有几种可能性:dd.MM.yyyy,dd.M.yyyy,d.MM.yyyy,d.M.yyyyy以及dd.MM.yy,d.MM.yy,d.M.yy。例如,您可以输入07.03.1993、7.3.93或任何内容 下面的正则表达式示例只检查格式验证,但不检查日期是否存在(例如,将允许使用29.02.2011或47.02.2011) 编辑:我刚刚创建了下面的正则表达式语句,现在它检查月份是否大于12,日期是否大于31。我想我应该先使用regex,然后用SimpleDa

我需要检查我的生日输入字段的值。应该有几种可能性:
dd.MM.yyyy
dd.M.yyyy
d.MM.yyyy
d.M.yyyyy
以及
dd.MM.yy
d.MM.yy
d.M.yy
。例如,您可以输入07.03.1993、7.3.93或任何内容

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

编辑:我刚刚创建了下面的正则表达式语句,现在它检查月份是否大于12,日期是否大于31。我想我应该先使用regex,然后用
SimpleDateFormat

String s = "^((0?[1-9]|[12][0-9]|3[01])\\.(0?[1-9]|1[012])\\.((19|20)\\d{2})$";

如果不需要正则表达式,可以尝试使用
java.text.simpleDataFormat
parse
方法将字符串转换为日期,并查看是否成功

如果是(您得到了一个有效的
Date
对象),则在表单(或输入)中输入了一个有效的日期。如果未成功,则
parse
函数返回
null
,并且您输入的
字符串
无效

这是
parse
方法的javadoc


编辑:如果您不想使用
setLenient
,您可以使用从
parse
获得的
Date
进行额外验证,并使用相同的格式将其转换回
字符串。然后将转换后的
字符串
与您作为输入提供的字符串进行比较。如果它们匹配,您就得到了有效的输入。

您可以将其拆分为日期的日和月部分

然后,您可以执行以下操作:

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
}
final int dayToCheck=32;//用户输入
最后一个整数月=2;//用户输入
最后整年=1981年;//用户输入
最终日历cal=Calendar.getInstance();
校准设置(年、月、1);//天不需要是用户输入,它可以是您想要检查的月份中的任何一天
如果(cal.getActualMaximum(Calendar.DAY\u OF\u MONTH)>dayToCheck){
//这一天无效
}
if(cal.getActualMinimum(日历日/月日)
您可以使用
Calendar.MONTH
字段执行相同的检查


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

解析方法将允许非闰年的29.02日期
SimpleDateFormat。解析不进行验证。例如,如果您执行
dated=newsimpledateformat(“yyyy-MM-dd”).parse(“2012-01-32”),则日期d将指2月1日,因为日期“溢出”到该月中。这不是真的Alderath,请使用
setLenient(false)
,然后您的日期将给出一个例外。您可以通过确定闰年并检查29/02来添加更多验证。但是,如果解析方法允许非闰年的29/02,那么
日期将包含什么?我认为返回的
Date
对象在非闰年中不允许29/02。您可以尝试使用静态方法
java.sql.Date.valueOf
并使用
java.sql.Date
而不是
java.util.Date
。谢谢@lucian.pantelimon,我将把您的
SimpleDataFormat
与正则表达式结合起来。我将向您展示它是否工作如果您编写
cal.set(2011,02,29)
,则不会出现错误。因此,我更喜欢@lucian.pantelimon的解决方案,并将其与我的工作结合起来。@YvesBeutler,正如我在回答中所说的:在创建日历时,不能设置完整的用户输入。您只需要设置年份和月份(您始终可以为日期设置1)。然后使用
cal.getActualMaximum(Calendar.DAY\u OF\u MONTH)
将其与当天的用户输入进行比较。没错。但我认为,比起像您这样的自制解决方案,让
SimpleDateFormat
检查日期是否正确是更好的方法。
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
}