日期部分校验
概念
首先,我们先了解2个概念:
1、合法的日期范围:
DateTime 值类型表示值范围在公元(基督纪元)0001 年 1 月 1 日午夜 12:00:00 到公元 (C.E.) 9999 年 12 月 31 日晚上 11:59:59 之间的日期和时间。
2、平年和闰年
地球绕太阳公转一周叫做一回归年,一回归年长365日5时48分 46秒。因此,公历规定有平年和闰年,平年一年有365日,比回归年短0.2422日,四年共短0.9688日,故每四年增加一日,这一年有366日,就 是闰年。但四年增加一日比四个回归年又多0.0312日,400年后将多3.12日,故在400年中少设3个闰年,也就是在400年中只设97个闰年,这样公历年的平均长度与回归年就相近似了。由此规定:年份是整百数的必须是400的倍数才是闰年,例如1900年、2100年就不是闰年。
验证YYYY年份:
1 | d{ 3 }[ 1 - 9 ]|d{ 2 }[ 1 - 9 ]d|d[ 1 - 9 ]d{ 2 }|[ 1 - 9 ]d{ 3 } |
验证MMDD月日:
大月(1、3、5、7、8、10、12月,有31天)
1 | ( 0 [ 13578 ]| 1 [ 02 ])( 0 [ 1 - 9 ]|[ 12 ]d| 3 [ 01 ]) |
小月(4、6、9、11月,有30天)
1 | ( 0 [ 469 ]| 11 )( 0 [ 1 - 9 ]|[ 12 ]d| 30 ) |
平年2月(有28天)
1 | 02 ( 0 [ 1 - 9 ]|[ 1 ]d| 2 [ 0 - 8 ]) |
闰年:
能被4整除但不能被100整除的年份
1 | (d{ 2 })( 0 [ 48 ]|[ 2468 ][ 048 ]|[ 13579 ][ 26 ]) |
能被400整除的年份
1 | (( 0 [ 48 ]|[ 2468 ][ 048 ]|[ 3579 ][ 26 ]) 00 ) |
闰年2月(有29天)
1 | ((d{ 2 })( 0 [ 48 ]|[ 2468 ][ 048 ]|[ 13579 ][ 26 ])|(( 0 [ 48 ]|[ 2468 ][ 048 ]|[ 3579 ][ 26 ]) 00 )) 0229 |
校验yyyyMMdd
最终,验证YYYYMMDD的正则表达式为
1 | ((d{ 3 }[ 1 - 9 ]|d{ 2 }[ 1 - 9 ]d|d[ 1 - 9 ]d{ 2 }|[ 1 - 9 ]d{ 3 })((( 0 [ 13578 ]| 1 [ 02 ])( 0 [ 1 - 9 ]|[ 12 ]d| 3 [ 01 ]))|(( 0 [ 469 ]| 11 )( 0 [ 1 - 9 ]|[ 12 ]d| 30 ))|( 02 ( 0 [ 1 - 9 ]|[ 1 ]d| 2 [ 0 - 8 ]))))|(((d{ 2 })( 0 [ 48 ]|[ 2468 ][ 048 ]|[ 13579 ][ 26 ])|(( 0 [ 48 ]|[ 2468 ][ 048 ]|[ 3579 ][ 26 ]) 00 )) 0229 ) |
校验yyyy-MM-dd
精确到日即可,即年月日,格式:yyyy-MM-dd,例如:2016-12-13
1 | ((([ 0 - 9 ]{ 3 }[ 1 - 9 ]|[ 0 - 9 ]{ 2 }[ 1 - 9 ][ 0 - 9 ]{ 1 }|[ 0 - 9 ]{ 1 }[ 1 - 9 ][ 0 - 9 ]{ 2 }|[ 1 - 9 ][ 0 - 9 ]{ 3 })-((( 0 [ 13578 ]| 1 [ 02 ])-( 0 [ 1 - 9 ]|[ 12 ][ 0 - 9 ]| 3 [ 01 ]))|(( 0 [ 469 ]| 11 )-( 0 [ 1 - 9 ]|[ 12 ][ 0 - 9 ]| 30 ))|( 02 -( 0 [ 1 - 9 ]|[ 1 ][ 0 - 9 ]| 2 [ 0 - 8 ]))))|((([ 0 - 9 ]{ 2 })( 0 [ 48 ]|[ 2468 ][ 048 ]|[ 13579 ][ 26 ])|(( 0 [ 48 ]|[ 2468 ][ 048 ]|[ 3579 ][ 26 ]) 00 ))- 02 - 29 )) |
时间部分校验
校验HHmmss
校验时分秒:格式:HHmmss
1 | ([ 0 - 1 ]?[ 0 - 9 ]| 2 [ 0 - 3 ])([ 0 - 5 ][ 0 - 9 ])([ 0 - 5 ][ 0 - 9 ]) |
校验HH-mm-ss
校验时分秒:格式:HH-mm-ss
1 | ([ 0 - 1 ]?[ 0 - 9 ]| 2 [ 0 - 3 ])-([ 0 - 5 ][ 0 - 9 ])-([ 0 - 5 ][ 0 - 9 ]) |
校验日期+时间部分
校验yyyyMMddHHmmss
1 | ((([ 0 - 9 ]{ 3 }[ 1 - 9 ]|[ 0 - 9 ]{ 2 }[ 1 - 9 ][ 0 - 9 ]{ 1 }|[ 0 - 9 ]{ 1 }[ 1 - 9 ][ 0 - 9 ]{ 2 }|[ 1 - 9 ][ 0 - 9 ]{ 3 })((( 0 [ 13578 ]| 1 [ 02 ])( 0 [ 1 - 9 ]|[ 12 ][ 0 - 9 ]| 3 [ 01 ]))|(( 0 [ 469 ]| 11 )( 0 [ 1 - 9 ]|[ 12 ][ 0 - 9 ]| 30 ))|( 02 ( 0 [ 1 - 9 ]|[ 1 ][ 0 - 9 ]| 2 [ 0 - 8 ]))))|((([ 0 - 9 ]{ 2 })( 0 [ 48 ]|[ 2468 ][ 048 ]|[ 13579 ][ 26 ])|(( 0 [ 48 ]|[ 2468 ][ 048 ]|[ 3579 ][ 26 ]) 00 )) 0229 ))([ 0 - 1 ]?[ 0 - 9 ]| 2 [ 0 - 3 ])([ 0 - 5 ][ 0 - 9 ])([ 0 - 5 ][ 0 - 9 ]) |
校验 yyyy-MM-dd HH:mm:ss
校验 yyyy-MM-dd HH:mm:ss(日期和时间之间有一个或多个空格)
1 | ((([ 0 - 9 ]{ 3 }[ 1 - 9 ]|[ 0 - 9 ]{ 2 }[ 1 - 9 ][ 0 - 9 ]{ 1 }|[ 0 - 9 ]{ 1 }[ 1 - 9 ][ 0 - 9 ]{ 2 }|[ 1 - 9 ][ 0 - 9 ]{ 3 })-((( 0 [ 13578 ]| 1 [ 02 ])-( 0 [ 1 - 9 ]|[ 12 ][ 0 - 9 ]| 3 [ 01 ]))|(( 0 [ 469 ]| 11 )-( 0 [ 1 - 9 ]|[ 12 ][ 0 - 9 ]| 30 ))|( 02 -( 0 [ 1 - 9 ]|[ 1 ][ 0 - 9 ]| 2 [ 0 - 8 ]))))|((([ 0 - 9 ]{ 2 })( 0 [ 48 ]|[ 2468 ][ 048 ]|[ 13579 ][ 26 ])|(( 0 [ 48 ]|[ 2468 ][ 048 ]|[ 3579 ][ 26 ]) 00 ))- 02 - 29 ))\s+([ 0 - 1 ]?[ 0 - 9 ]| 2 [ 0 - 3 ]):([ 0 - 5 ][ 0 - 9 ]):([ 0 - 5 ][ 0 - 9 ]) |
应用举例
卫生数据元校验
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | case "D8" : if (!value_str.matches( "((\d{3}[1-9]|\d{2}[1-9]\d|\d[1-9]\d{2}|[1-9]\d{3})(((0[13578]|1[02])(0[1-9]|[12]\d|3[01]))|((0[469]|11)(0[1-9]|[12]\d|30))|(02(0[1-9]|[1]\d|2[0-8]))))|(((\d{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229)" )){ valid = false ; tipInfo = "不符合日期格式yyyyMMdd" ; break ; } break ; case "T6" : if (!value_str.matches( "([0-1]?[0-9]|2[0-3])([0-5][0-9])([0-5][0-9])" )){ valid = false ; tipInfo = "不符合时间格式HHmmss" ; break ; } break ; case "DT15" : if (!value_str.matches( "(((\d{3}[1-9]|\d{2}[1-9]\d|\d[1-9]\d{2}|[1-9]\d{3})(((0[13578]|1[02])(0[1-9]|[12]\d|3[01]))|((0[469]|11)(0[1-9]|[12]\d|30))|(02(0[1-9]|[1]\d|2[0-8]))))|(((\d{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229))(T)(([0-1]?[0-9]|2[0-3])([0-5][0-9])([0-5][0-9]))" )){ valid = false ; tipInfo = "不符合日期时间格式yyyyMMddTHHmmss" ; break ; } break ; |
参考文章:
https://www.cnblogs.com/Alisa68/p/13208704.html
https://www.cnblogs.com/yyy-blog/p/10593983.html
总结
到此这篇关于正则表达式校验日期时间格式的文章就介绍到这了,更多相关正则表达式校验日期时间格式内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!