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
}