严格验证日期及时间的正则表达
2012-11-28 21:55
211 查看
用JDBC把日期格式化后插入日期到数据库,发现 用java.utils.Date 中的方法都过时、官方不推荐使用。
Cloneable又太复杂,于是自己封装个类,实现对日期字符串的格式化。MySQL支持的日期格式:
yyyy-MM-dd HH:mm:ss 。如果写在2012-59-05,应该抛出异常。但它没有、却以
2019-11-05插入、这个无法接受,所以要封装个类做出验证。
String strDate="2009-5-6";
boolean flag=strDate.matches("
((((1[6-9]|[2-9]\\d)\\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-0?2-(0?[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)) (20|21|22|23|[0-1]?\\d):[0-5]?\\d:[0-5]?\\d|((((1[6-9]|[2-9]\\d)\\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-0?2-(0?[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))");
if (flag) {
System.out.println(UmeSQLDate.sqlDate(strDate));
}else {
throw new RuntimeException("时期格式不对");
}
测试发现正则对于闰年 平年无法作出验证、下面
添加了闰年的验证:
^(((1[8-9]\d{2})|([2-9]\d{3}))([-\/])(10|12|0?[13578])([-\/])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/])(11|0?[469])([-\/])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/])(0?2)([-\/])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-\/])(0?2)([-\/])(29)$)|(^([3579][26]00)([-\/])(0?2)([-\/])(29)$)|(^([1][89][0][48])([-\/])(0?2)([-\/])(29)$)|(^([2-9][0-9][0][48])([-\/])(0?2)([-\/])(29)$)|(^([1][89][2468][048])([-\/])(0?2)([-\/])(29)$)|(^([2-9][0-9][2468][048])([-\/])(0?2)([-\/])(29)$)|(^([1][89][13579][26])([-\/])(0?2)([-\/])(29)$)|(^([2-9][0-9][13579][26])([-\/])(0?2)([-\/])(29))|(((((0[13578])|([13578])|(1[02]))[\-\/\s]?((0[1-9])|([1-9])|([1-2][0-9])|(3[01])))|((([469])|(11))[\-\/\s]?((0[1-9])|([1-9])|([1-2][0-9])|(30)))|((02|2)[\-\/\s]?((0[1-9])|([1-9])|([1-2][0-9]))))[\-\/\s]?\d{4})(\s(((0[1-9])|([1-9])|(1[0-2]))\:([0-5][0-9])((\s)|(\:([0-5][0-9])\s))([AM|PM|am|pm]{2,2})))?$
对时间验证的的正则
^(20|21|22|23|[0-1]?\\d):[0-5]?\\d:[0-5]?\\d$
封装类如下:
Cloneable又太复杂,于是自己封装个类,实现对日期字符串的格式化。MySQL支持的日期格式:
yyyy-MM-dd HH:mm:ss 。如果写在2012-59-05,应该抛出异常。但它没有、却以
2019-11-05插入、这个无法接受,所以要封装个类做出验证。
String strDate="2009-5-6";
boolean flag=strDate.matches("
((((1[6-9]|[2-9]\\d)\\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-0?2-(0?[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)) (20|21|22|23|[0-1]?\\d):[0-5]?\\d:[0-5]?\\d|((((1[6-9]|[2-9]\\d)\\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-0?2-(0?[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))");
if (flag) {
System.out.println(UmeSQLDate.sqlDate(strDate));
}else {
throw new RuntimeException("时期格式不对");
}
测试发现正则对于闰年 平年无法作出验证、下面
添加了闰年的验证:
对时间验证的的正则
^(20|21|22|23|[0-1]?\\d):[0-5]?\\d:[0-5]?\\d$
封装类如下:
package iumex.mybatis.utils; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class UmexSQLDate { public static Date sqlDate(final String date){ boolean dateFlag=false; String regexDate="^(((1[8-9]\\d{2})|([2-9]\\d{3}))([-\\/])(10|12|0?[13578])([-\\/])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]\\d{2})|([2-9]\\d{3}))([-\\/])(11|0?[469])([-\\/])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]\\d{2})|([2-9]\\d{3}))([-\\/])(0?2)([-\\/])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-\\/])(0?2)([-\\/])(29)$)|(^([3579][26]00)([-\\/])(0?2)([-\\/])(29)$)|(^([1][89][0][48])([-\\/])(0?2)([-\\/])(29)$)|(^([2-9][0-9][0][48])([-\\/])(0?2)([-\\/])(29)$)|(^([1][89][2468][048])([-\\/])(0?2)([-\\/])(29)$)|(^([2-9][0-9][2468][048])([-\\/])(0?2)([-\\/])(29)$)|(^([1][89][13579][26])([-\\/])(0?2)([-\\/])(29)$)|(^([2-9][0-9][13579][26])([-\\/])(0?2)([-\\/])(29))|(((((0[13578])|([13578])|(1[02]))[\\-\\/\\s]?((0[1-9])|([1-9])|([1-2][0-9])|(3[01])))|((([469])|(11))[\\-\\/\\s]?((0[1-9])|([1-9])|([1-2][0-9])|(30)))|((02|2)[\\-\\/\\s]?((0[1-9])|([1-9])|([1-2][0-9]))))[\\-\\/\\s]?\\d{4})(\\s(((0[1-9])|([1-9])|(1[0-2]))\\:([0-5][0-9])((\\s)|(\\:([0-5][0-9])\\s))([AM|PM|am|pm]{2,2})))?$"; dateFlag=date.matches(regexDate); if (dateFlag != true) { throw new RuntimeException("日期格式或年、月、日范围不正确!如果输入为2月份请区分平年、闰年……"); } try { return new SimpleDateFormat("yyyy-MM-dd").parse(date); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException("日期转换出错:日期字符串格式应为yyyy-mm-dd"); } } public static Date sqlDateTime(final String datetime){ boolean dateFlag=false; boolean timeFlag=false; String regexDate="^(((1[8-9]\\d{2})|([2-9]\\d{3}))([-\\/])(10|12|0?[13578])([-\\/])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]\\d{2})|([2-9]\\d{3}))([-\\/])(11|0?[469])([-\\/])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]\\d{2})|([2-9]\\d{3}))([-\\/])(0?2)([-\\/])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-\\/])(0?2)([-\\/])(29)$)|(^([3579][26]00)([-\\/])(0?2)([-\\/])(29)$)|(^([1][89][0][48])([-\\/])(0?2)([-\\/])(29)$)|(^([2-9][0-9][0][48])([-\\/])(0?2)([-\\/])(29)$)|(^([1][89][2468][048])([-\\/])(0?2)([-\\/])(29)$)|(^([2-9][0-9][2468][048])([-\\/])(0?2)([-\\/])(29)$)|(^([1][89][13579][26])([-\\/])(0?2)([-\\/])(29)$)|(^([2-9][0-9][13579][26])([-\\/])(0?2)([-\\/])(29))|(((((0[13578])|([13578])|(1[02]))[\\-\\/\\s]?((0[1-9])|([1-9])|([1-2][0-9])|(3[01])))|((([469])|(11))[\\-\\/\\s]?((0[1-9])|([1-9])|([1-2][0-9])|(30)))|((02|2)[\\-\\/\\s]?((0[1-9])|([1-9])|([1-2][0-9]))))[\\-\\/\\s]?\\d{4})(\\s(((0[1-9])|([1-9])|(1[0-2]))\\:([0-5][0-9])((\\s)|(\\:([0-5][0-9])\\s))([AM|PM|am|pm]{2,2})))?$"; String regexTime="^(20|21|22|23|[0-1]?\\d):[0-5]?\\d:[0-5]?\\d$"; String[] tem_datetime=datetime.split("\\s+"); if (tem_datetime.length>=0 && tem_datetime.length<=2) { dateFlag=tem_datetime[0].matches(regexDate); if (tem_datetime.length==1) { timeFlag=true; }else { timeFlag=tem_datetime[1].matches(regexTime); } } if (timeFlag&&dateFlag != true) { throw new RuntimeException("日期格式或年、月、日、时、范围不正确!如果输入为2月份请区分平年、闰年……"); } try { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(datetime); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException("日期转换出错:日期字符串格式应为yyyy-MM-dd HH:mm:ss"); } } }
相关文章推荐
- javascript 验证日期时间的正则表达式
- js正则表达式具体时间的验证,当前日期跟所填日期比较大小,时间的比较
- 手机与电话的正则表达式 验证有效日期时间的正则表达式(已解决闰二月)
- 验证有效 "日期时间" 的正则表达式(已解决闰二月)
- 请教:验证日期时间的正则表达式
- 常用正则表达式大全,手机、电话、邮箱、身份证(最严格的验证)、IP地址、网址、日期等,一般前台js验证
- 验证有效 "日期时间" 的正则表达式(已解决闰二月)
- 常用正则表达式大全,手机、电话、邮箱、身份证(最严格的验证)、IP地址、网址、日期等,一般前台js验证,来这里就够了...
- 验证日期时间的正则表达式
- 正则表达式 - java验证IP地址 - java验证日期时间,解决润月 - java验证邮箱格式
- 验证有效 "日期时间" 的正则表达式(已解决闰二月)
- js验证日期时间格式正则表达式
- 常用正则表达式大全,手机、电话、邮箱、身份证(最严格的验证)、IP地址、网址、日期等,一般前台js验证,来这里就够了...
- 常用正则表达式大全,手机、电话、邮箱、身份证(最严格的验证)、IP地址、网址、日期等,一般前台js验证
- 验证有效 "日期时间" 的正则表达式(已解决闰二月)
- 常用正则表达式大全,手机、电话、邮箱、身份证(最严格的验证)、IP地址、网址、日期等,一般前台js验证,来这里就够了...
- 验证日期时间的正则表达式
- 超强的正则表达式验证日期和时间
- 常用正则表达式大全,手机、电话、邮箱、身份证(最严格的验证)、IP地址、网址、日期等,一般前台js验证,来这里就够了...
- 验证有效 "日期时间" 的正则表达式(已解决闰二月)