谭水山 發表於 2024-5-11 11:38:33

常用日期格式正则表达式详解(完善版)

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">第一步,验证年份</a></li><li><a href="#_label1">第二步,验证月份和日期</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">1. 月份为,天数范围为01-31</a></li><li><a href="#_lab2_1_1">2. 月份为,天数范围为01-30</a></li><li><a href="#_lab2_1_2">3. 月份为2月</a></li><ul class="third_class_ul"><li><a href="#_label3_1_2_0">3.1 平年,2月为01-28</a></li><li><a href="#_label3_1_2_1">3.2 闰年,2月为01-29</a></li></ul></ul><li><a href="#_label2">结论:</a></li><ul class="second_class_ul"></ul><li><a href="#_label3">附:日期计算</a></li><ul class="second_class_ul"></ul><li><a href="#_label4">总结&nbsp;</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>第一步,验证年份</h2>
<p>年份范围为 0001 - 9999,匹配YYYY的正则表达式为:</p>
<div class="jb51code"><pre class="brush:js;">{3}|{2}{1}|{1}{2}|{3}
</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>第二步,验证月份和日期</h2>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>1. 月份为,天数范围为01-31</h3>
<p>匹配MM__sep__DD的正则表达式为:</p>
<div class="jb51code"><pre class="brush:js;">(0|1)__sep__(0||3)
</pre></div>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>2. 月份为,天数范围为01-30</h3>
<p>匹配MM__sep__DD的正则表达式为:</p>
<div class="jb51code"><pre class="brush:js;">(0|11)__sep__(0||30)
</pre></div>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>3. 月份为2月</h3>
<p class="maodian"><a name="_label3_1_2_0"></a></p><h4>3.1 平年,2月为01-28</h4>
<div class="jb51code"><pre class="brush:js;">02__sep__(0||2)
</pre></div>
<p class="maodian"><a name="_label3_1_2_1"></a></p><h4>3.2 闰年,2月为01-29</h4>
<p>由于上面已经把2月01-28都包含了,所以这里只需要把2月29号匹配出来即可</p>
<p><strong>1. 能被4整除,但不能被100整除</strong></p>
<p>前两位不需要考虑,后两位能被4整除只有以下3种情况:</p>
<ul><li>①十位为0,个位为</li><li>②十位为,个位为</li><li>③十位为,个位为</li></ul>
<p>则年份正则表达式为:</p>
<div class="jb51code"><pre class="brush:js;">({2})(0||)
</pre></div>
<p>YYYY__sep__MM__sep__DD:</p>
<div class="jb51code"><pre class="brush:js;">({2})(0||)__sep__02__sep__29
</pre></div>
<p><strong>2. 能被400整除</strong></p>
<p>首先,能被400整除,后两位一定是00,则只需要保证前两位能被4整除。</p>
<p>前两位能被4整除只有以下3种情况:</p>
<ul><li>①千位为0,百位为</li><li>②千位为,百位为</li><li>③千位为,百位为</li></ul>
<p>则年份正则表达式为:</p>
<div class="jb51code"><pre class="brush:js;">(0||)00
</pre></div>
<p>YYYY__sep__MM__sep__DD:</p>
<div class="jb51code"><pre class="brush:js;">(0||)00__sep__02__sep__29
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>结论:</h2>
<ul><li>平年</li></ul>
<p>增加缩进,方便理解</p>
<div class="jb51code"><pre class="brush:js;">({3}|{2}{1}|{1}{2}|{3})
__sep__
(
((0|1)__sep__(0||3))
|
((0|11)__sep__(0||30))
|
(02__sep__(0||2))
)
</pre></div>
<p>直接使用,方便复制替换</p>
<div class="jb51code"><pre class="brush:js;">({3}|{2}{1}|{1}{2}|{3})__sep__(((0|1)__sep__(0||3))|((0|11)__sep__(0||30))|(02__sep__(0||2)))
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202405/2024051111344239.png" /></p>
<ul><li>闰年</li></ul>
<p>增加缩进,方便理解</p>
<div class="jb51code"><pre class="brush:js;">(({2})(0||)__sep__02__sep__29)
|
((0||)00__sep__02__sep__29)
</pre></div>
<p>直接使用,方便复制替换</p>
<div class="jb51code"><pre class="brush:js;">(({2})(0||)__sep__02__sep__29)|((0||)00__sep__02__sep__29)
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202405/2024051111344340.png" /></p>
<ul><li>平年和闰年合并</li></ul>
<p>根据上述1和2,可以得出一个匹配合法日期的正则表达式(不区分平年和闰年)<br />增加缩进,方便理解</p>
<div class="jb51code"><pre class="brush:js;">(({3}|{2}{1}|{1}{2}|{3})
__sep__
(
((0|1)__sep__(0||3))
|
((0|11)__sep__(0||30))
|
(02__sep__(0||2))
))
|
((({2})(0||)__sep__02__sep__29)
|
((0||)00__sep__02__sep__29))
</pre></div>
<p>直接使用,方便复制替换</p>
<div class="jb51code"><pre class="brush:js;">(({3}|{2}{1}|{1}{2}|{3})__sep__(((0|1)__sep__(0||3))|((0|11)__sep__(0||30))|(02__sep__(0||2))))|((({2})(0||)__sep__02__sep__29)|((0||)00__sep__02__sep__29))
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202405/2024051111344341.png" /></p>
<p class="maodian"><a name="_label3"></a></p><h2>附:日期计算</h2>
<p>JS的正则表达式还可以用来进行日期计算。下面是一个计算两个日期之间相差天数的例子:</p>
<div class="jb51code"><pre class="brush:js;">function dateDiff(startDate, endDate){let start = new Date(startDate);let end = new Date(endDate);let diff = end.getTime()- start.getTime();return Math.floor(diff /(24 * 3600 * 1000));}console.log(dateDiff('2023-04-01','2023-05-01'));//输出30</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>总结&nbsp;</h2>
頁: [1]
查看完整版本: 常用日期格式正则表达式详解(完善版)