正则 校 验 时间格式

最强日期正则表达式原创

冰河技术 2022-04-23 09:18:54 ©著作权

文章标签 正则表达式 整除 日期格式 文章分类 其它 其它

©著作权归作者所有:来自51CTO博客作者冰河技术的原创作品,请联系作者获取转载授权,否则将追究法律责任

 

一、简单的日期判断(YYYY/MM/DD): 

^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$

二、演化的日期判断(YYYY/MM/DD| YY/MM/DD): 

  ^(^(\d{4}|\d{2})(\-|\/|\.)\d{1,2}\3\d{1,2}$)|(^\d{4} 年 \d{1,2} 月 \d{1,2} 日 $)$

三、加入闰年的判断的:

实例:

            ^((((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-))$

分析:

1、什么是合法的日期范围?对于不同的应用场景,这个问题有不同的解释。这里采纳MSDN中的约定:

            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 年就不是 闰 年 。

首先需要 验证 年份, 显 然,年份范 围为 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}

其中 [0-9] 也可以表示为 \d,但 \d 不如 [0-9] 直观,因此下面我将一直采用 [0-9]

用正则表达式验证日期的难点有二:一是大小月份的天数不同,二是闰年的考虑。

对于第一个难点,我们首先不考虑闰年,假设2月份都是28天,这样,月份和日期可以分成三种情况:

1、月份为 1, 3, 5, 7, 8, 10, 12,天数范围为 01 - 31,匹配MM-DD的正则表达式为:

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

2、月份为 4, 6, 9, 11,天数范围为 01-30,匹配MM-DD的正则表达式为:

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

3、月份为 2,考虑平年情况,匹配MM-DD的正则表达式为:

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

根据上面的成果,我们可以得到匹配平年日期格式为YYYY-MM-DD的正则表达式:

([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])))

接着我们来解决第二个难点:闰年的考虑。根据闰年的定义,我们可以将闰年分为两类:

1、能被4整除但不能被100整除的年份。寻找后两位的变化规律,可以很快得到下面的正则匹配:

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

2、能被400整除的年份。能被400整除的数肯定能被100整除,因此后两位肯定是00,我们只要保证前两位能被4整除即可,相应的正则表达式为:

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

2.最强验证日期的正则表达式,添加了闰年的验证 这个日期正则表达式支持YYYY-MM-DD YYYY/MM/DD YYYY_MM_DD YYYY.MM.DD的形式 match : 2015-10-05 2015/10/05not match : 2015-10-05   2015-10-05

完整的正则表达式如下:

((^((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)$))

闰 年的 2 月份有 29 天,因此匹配 闰 年日期格式 为 YYYY-MM-DD 的正 则 表达式 为 :

(([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29最后,将平年和闰年的日期验证表达式合并,我们得到最终的验证日期格式为YYYY-MM-DD的正则表达式为:(([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)DD/MM/YYYY格式的正则验证表达式为:(((0[1-9]|[12][0-9]|3[01])/((0[13578]|1[02]))|((0[1-9]|[12][0-9]|30)/(0[469]|11))|(0[1-9]|[1][0-9]|2[0-8])/(02))/([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}))|(29/02/(([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00)))

  • 打赏
  • 收藏
  • 评论
  • 分享
  • 举报

上一篇:一个微博数据库设计带来的简单思考

下一篇:主流手机分辨率与尺寸

正则 校 验 时间格式

提问和评论都可以,用心的回复会被更多人看到 评论

发布评论

全部评论 () 最热 最新

相关文章

  • 最强常用正则表达式

    一、校验数字的表达式 数字:^[0-9]*$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数字:^\d{m,n}$ 零和非零开头的数字:^(0|[1-9][0-9]*)$ 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$ 带1- ...

    字符串 下划线 浮点数 ip地址 正则表达式

  • 日期时间正则表达式

     日期时间正则表达式   正则表达式 (?n:^(?=\d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(?(.0?2)(?=.{3,4}(1[6-9]|[2-9]\

    正则表达式

  • 日期正则表达式yyyyMMdd

    日期校验yyyyMMdd, 包括闰月等校验.

    java 正则表达式 架构师 大数据 微服务

  • php 日期正则表达式

    本文章提供一款利用正则表达式来验证日期是不是正则的日期格式了,第一个是一款正常的日期验证,安全通过了,第二款日期格式有问题,所以输出日期不合法了.幼儿园装修设计 PHP实例代码如下: <?php $date="2003-01-31"; if (ereg ("([0-9]{4})-([0-9]{1,2

    日期格式 php 实例代码 正则 html

  • 正则表达式、扩展正则表达式

                             正则表达式、扩展正则表达式及其应用1.什么是正则表达式?正则表达式(REGEXP:REGular EXPression),就是一种处理字符的方法,它以行为单位进行字符串处理的。其实就是透过一些特

    正则表达式 扩展正则表达式

  • 正则应用,日期正则表达式

     1 概述首先需要说明的一点,无论是Winform,还是Webform,都有很成熟的日历控件,无论从易用性还是可扩展性上看,日期的选择和校验还是用日历控件来实现比较好。前几天在CSDN多个版块看到需要日期正则的帖子,所以整理了这篇文章,和大家一起讨论交流,如有遗漏或错误的地方,还请大家指正。日期正则一般是对格式有要求,且数据不是直接由用户输入时使用。因应用场景的不同,写出的正则也不同,复杂程度也自然不同。正则的书写需要根据具体情况具体分析,一个基本原则就是:只写合适的,不写复杂的。对于日期提取,只要能与非日期区分开,写最简单的正则即可,如\d{4}-\d{2}-\d{2}如果可以在源字符串中唯一