一文教会你用正则表达式校验日期时间格式
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">日期部分校验</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">概念</a></li><li><a href="#_lab2_0_1">验证YYYY年份:</a></li><li><a href="#_lab2_0_2">验证MMDD月日:</a></li></ul><li><a href="#_label1">时间部分校验</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_3">校验HHmmss</a></li><li><a href="#_lab2_1_4">校验HH-mm-ss</a></li></ul><li><a href="#_label2">校验日期+时间部分</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_5">校验yyyyMMddHHmmss</a></li><li><a href="#_lab2_2_6">校验 yyyy-MM-dd HH:mm:ss</a></li></ul><li><a href="#_label3">应用举例</a></li><ul class="second_class_ul"></ul><li><a href="#_label4">总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>日期部分校验</h2><p class="maodian"><a name="_lab2_0_0"></a></p><h3>概念</h3>
<p>首先,我们先了解2个概念:</p>
<p>1、合法的日期范围:</p>
<p> DateTime 值类型表示值范围在公元(基督纪元)0001 年 1 月 1 日午夜 12:00:00 到公元 (C.E.) 9999 年 12 月 31 日晚上 11:59:59 之间的日期和时间。</p>
<p>2、平年和闰年</p>
<p>地球绕太阳公转一周叫做一回归年,一回归年长365日5时48分 46秒。因此,公历规定有平年和闰年,平年一年有365日,比回归年短0.2422日,四年共短0.9688日,故每四年增加一日,这一年有366日,就 是闰年。但四年增加一日比四个回归年又多0.0312日,400年后将多3.12日,故在400年中少设3个闰年,也就是在400年中只设97个闰年,这样公历年的平均长度与回归年就相近似了。由此规定:年份是整百数的必须是400的倍数才是闰年,例如1900年、2100年就不是闰年。</p>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>验证YYYY年份:</h3>
<div class="jb51code"><pre class="brush:java;">\d{3}|\d{2}\d|\d\d{2}|\d{3}</pre></div>
<p class="maodian"><a name="_lab2_0_2"></a></p><h3>验证MMDD月日:</h3>
<p>大月(1、3、5、7、8、10、12月,有31天)</p>
<div class="jb51code"><pre class="brush:java;">(0|1)(0|\d|3)</pre></div>
<p>小月(4、6、9、11月,有30天)</p>
<div class="jb51code"><pre class="brush:java;">(0|11)(0|\d|30)</pre></div>
<p>平年2月(有28天)</p>
<div class="jb51code"><pre class="brush:java;">02(0|\d|2)</pre></div>
<p>闰年:</p>
<p>能被4整除但不能被100整除的年份</p>
<div class="jb51code"><pre class="brush:java;">(\d{2})(0||)</pre></div>
<p>能被400整除的年份</p>
<div class="jb51code"><pre class="brush:java;">((0||)00)</pre></div>
<p>闰年2月(有29天)</p>
<div class="jb51code"><pre class="brush:java;">((\d{2})(0||)|((0||)00))0229</pre></div>
<p>校验yyyyMMdd</p>
<p>最终,验证YYYYMMDD的正则表达式为</p>
<div class="jb51code"><pre class="brush:java;">((\d{3}|\d{2}\d|\d\d{2}|\d{3})(((0|1)(0|\d|3))|((0|11)(0|\d|30))|(02(0|\d|2))))|(((\d{2})(0||)|((0||)00))0229)</pre></div>
<p>校验yyyy-MM-dd</p>
<p>精确到日即可,即年月日,格式:yyyy-MM-dd,例如:2016-12-13</p>
<div class="jb51code"><pre class="brush:java;">((({3}|{2}{1}|{1}{2}|{3})-(((0|1)-(0||3))|((0|11)-(0||30))|(02-(0||2))))|((({2})(0||)|((0||)00))-02-29))</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>时间部分校验</h2>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>校验HHmmss</h3>
<p>校验时分秒:格式:HHmmss</p>
<div class="jb51code"><pre class="brush:java;">(?|2)()()</pre></div>
<p class="maodian"><a name="_lab2_1_4"></a></p><h3>校验HH-mm-ss</h3>
<p>校验时分秒:格式:HH-mm-ss</p>
<div class="jb51code"><pre class="brush:java;">(?|2)-()-()</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>校验日期+时间部分</h2>
<p class="maodian"><a name="_lab2_2_5"></a></p><h3>校验yyyyMMddHHmmss</h3>
<div class="jb51code"><pre class="brush:java;">((({3}|{2}{1}|{1}{2}|{3})(((0|1)(0||3))|((0|11)(0||30))|(02(0||2))))|((({2})(0||)|((0||)00))0229))(?|2)()()</pre></div>
<p class="maodian"><a name="_lab2_2_6"></a></p><h3>校验 yyyy-MM-dd HH:mm:ss</h3>
<p>校验 yyyy-MM-dd HH:mm:ss(日期和时间之间有一个或多个空格)</p>
<div class="jb51code"><pre class="brush:java;">((({3}|{2}{1}|{1}{2}|{3})-(((0|1)-(0||3))|((0|11)-(0||30))|(02-(0||2))))|((({2})(0||)|((0||)00))-02-29))\\s+(?|2):():()</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>应用举例</h2>
<p>卫生数据元校验</p>
<div class="jb51code"><pre class="brush:java;"> case "D8":
if(!value_str.matches("((\\d{3}|\\d{2}\\d|\\d\\d{2}|\\d{3})(((0|1)(0|\\d|3))|((0|11)(0|\\d|30))|(02(0|\\d|2))))|(((\\d{2})(0||)|((0||)00))0229)")){
valid = false;
tipInfo = "不符合日期格式yyyyMMdd";
break;
}
break;
case "T6":
if(!value_str.matches("(?|2)()()")){
valid = false;
tipInfo = "不符合时间格式HHmmss";
break;
}
break;
case "DT15":
if(!value_str.matches("(((\\d{3}|\\d{2}\\d|\\d\\d{2}|\\d{3})(((0|1)(0|\\d|3))|((0|11)(0|\\d|30))|(02(0|\\d|2))))|(((\\d{2})(0||)|((0||)00))0229))(T)((?|2)()())")){
valid = false;
tipInfo = "不符合日期时间格式yyyyMMddTHHmmss";
break;
}
break;</pre></div>
<p><strong>参考文章:</strong></p>
<p>https://www.cnblogs.com/Alisa68/p/13208704.html</p>
<p>https://www.cnblogs.com/yyy-blog/p/10593983.html</p>
<p class="maodian"><a name="_label4"></a></p><h2>总结</h2>
頁:
[1]