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


目录
  • 第一步,验证年份
  • 第二步,验证月份和日期
    • 1. 月份为[1, 3, 5, 7, 8, 10, 12],天数范围为01-31
    • 2. 月份为[4, 6, 9, 11],天数范围为01-30
    • 3. 月份为2月
      • 3.1 平年,2月为01-28
      • 3.2 闰年,2月为01-29
  • 结论:
    • 附:日期计算
      • 总结 

        第一步,验证年份

        年份范围为 0001 - 9999,匹配YYYY的正则表达式为:

        [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}
        

        第二步,验证月份和日期

        1. 月份为[1, 3, 5, 7, 8, 10, 12],天数范围为01-31

        匹配MM__sep__DD的正则表达式为:

        (0[13578]|1[02])__sep__(0[1-9]|[12][0-9]|3[01])
        

        2. 月份为[4, 6, 9, 11],天数范围为01-30

        匹配MM__sep__DD的正则表达式为:

        (0[469]|11)__sep__(0[1-9]|[12][0-9]|30)
        

        3. 月份为2月

        3.1 平年,2月为01-28

        02__sep__(0[1-9]|[1][0-9]|2[0-8])
        

        3.2 闰年,2月为01-29

        由于上面已经把2月01-28都包含了,所以这里只需要把2月29号匹配出来即可

        1. 能被4整除,但不能被100整除

        前两位不需要考虑,后两位能被4整除只有以下3种情况:

        • ①十位为0,个位为[4,8]
        • ②十位为[2,4,6,8],个位为[0,4,8]
        • ③十位为[1,3,5,7,9],个位为[2,6]

        则年份正则表达式为:

        ([0-9]{2})(0[48]|[2468][048]|[13579][26])
        

        YYYY__sep__MM__sep__DD:

        ([0-9]{2})(0[48]|[2468][048]|[13579][26])__sep__02__sep__29
        

        2. 能被400整除

        首先,能被400整除,后两位一定是00,则只需要保证前两位能被4整除。

        前两位能被4整除只有以下3种情况:

        • ①千位为0,百位为[4,8]
        • ②千位为[2,4,6,8],百位为[0,4,8]
        • ③千位为[1,3,5,7,9],百位为[2,6]

        则年份正则表达式为:

        (0[48]|[2468][048]|[13579][26])00
        

        YYYY__sep__MM__sep__DD:

        (0[48]|[2468][048]|[13579][26])00__sep__02__sep__29
        

        结论:

        • 平年

        增加缩进,方便理解

        ([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})
        __sep__
        (
          ((0[13578]|1[02])__sep__(0[1-9]|[12][0-9]|3[01]))
          |
          ((0[469]|11)__sep__(0[1-9]|[12][0-9]|30))
          |
          (02__sep__(0[1-9]|[1][0-9]|2[0-8]))
        )
        

        直接使用,方便复制替换

        ([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})__sep__(((0[13578]|1[02])__sep__(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)__sep__(0[1-9]|[12][0-9]|30))|(02__sep__(0[1-9]|[1][0-9]|2[0-8])))
        

        • 闰年

        增加缩进,方便理解

        (([0-9]{2})(0[48]|[2468][048]|[13579][26])__sep__02__sep__29)
        |
        ((0[48]|[2468][048]|[13579][26])00__sep__02__sep__29)
        

        直接使用,方便复制替换

        (([0-9]{2})(0[48]|[2468][048]|[13579][26])__sep__02__sep__29)|((0[48]|[2468][048]|[13579][26])00__sep__02__sep__29)
        

        • 平年和闰年合并

        根据上述1和2,可以得出一个匹配合法日期的正则表达式(不区分平年和闰年)
        增加缩进,方便理解

        (([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})
        __sep__
        (
          ((0[13578]|1[02])__sep__(0[1-9]|[12][0-9]|3[01]))
          |
          ((0[469]|11)__sep__(0[1-9]|[12][0-9]|30))
          |
          (02__sep__(0[1-9]|[1][0-9]|2[0-8]))
        ))
        |
        ((([0-9]{2})(0[48]|[2468][048]|[13579][26])__sep__02__sep__29)
        |
        ((0[48]|[2468][048]|[13579][26])00__sep__02__sep__29))
        

        直接使用,方便复制替换

        (([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})__sep__(((0[13578]|1[02])__sep__(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)__sep__(0[1-9]|[12][0-9]|30))|(02__sep__(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])__sep__02__sep__29)|((0[48]|[2468][048]|[13579][26])00__sep__02__sep__29))
        

        附:日期计算

        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

        总结 

        到此这篇关于常用日期格式正则表达式的文章就介绍到这了,更多相关日期格式正则表达式内容请搜索PHP之友以前的文章或继续浏览下面的相关文章希望大家以后多多支持PHP之友!

        您可能感兴趣的文章:
        • 匹配yyyy-mm-dd日期格式的的正则表达式
        • 正则表达式实现将MM/DD/YYYY格式的日期转换为YYYY-MM-DD格式
        • 一文教会你用正则表达式校验日期时间格式

        相关内容