正则表达式验证日期(多种日期格式)——转载

1、概述

  首先需要说明的一点,无论是 Winform ,还是 Webform ,都有很成熟的日历控件,无论从易用性还是可扩展性上看,日期的选择和校验还是用日历控件来实现比较好。

  前几天在 CSDN 多个版块看到需要日期正则的帖子,所以整理了这篇文章,和大家一起讨论交流,如有遗漏或错误的地方,还请大家指正。

  日期正则一般是对格式有要求,且数据不是直接由用户输入时使用。因应用场景的不同,写出的正则也不同,复杂程度也自然不同。正则的书写需要根据具体情况具体分析,一个基本原则就 是:只写合适的,不写复杂的 。

  对于日期提取,只要能与非日期区分开,写最简单的正则即可,如

\d{4}-\d{2}-\d{2}

如果可以在源字符串中唯一定位 yyyy-MM-dd 格式的日期,则可用做提取。

对于验证,如果仅仅是验证字符组成及格式是没有多大意义的,还要加入对规则的校验。由于闰年的存在,使得日期的校验正则变得比较复杂。

先来考察一下日期的有效范围以及什么是闰年。

2、日期的规则

2.1 日期的有效范围

对于日期的有效范围,不同的应用场景会有所不同。

MSDN 中定义的 DateTime 对象的有效范围是: 0001-01-01 00:00:00 到 9999-12-31 23:59:59 。

UNIX 时间戳的 0 按照 ISO 8601 规范为 : 1970-01-01T00:00:00Z 。

而实际应用中,日期的范围基本上不会超出 DateTime 所规定的范围,所以正则验证取其中常用的日期范围即可。

2.2 什么是闰年

(以下摘自百度百科)

闰年 (leap year) 是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。补上时间差的年份为闰年。

地球绕日运行周期为 365 天 5 小时 48 分 46 秒(合 365.24219 天),即一 回归年 ( tropical year )。公历的平年只有 365 日,比回归年短约 0.2422 日,每四年累积约一天,把这一天加于 2 月末(即 2 月 29 日),使当年时间长度变为 366 日,这一年就为闰年。

需要注意的是 , 现在的公历是根据罗马人的“儒略历”改编而得。由于当时没有了解到每年要多算出 0.0078 天的问题,从公元前 46 年,到 16 世纪,一共累计多出了 10 天。为此,当时的教皇格雷果里十三世,将 1582 年 10 月 5 日人为规定为 10 月 15 日。并开始了新闰年规定。即规定公历年份是整百数的,必须是 400 的倍数才是闰年,不是 400 的倍数的就是平年。比如, 1700 年、 1800 年和 1900 年为平年, 2000 年为闰年。此后,平均每年长度为 365.2425 天,约 4 年出现 1 天的偏差。按照每四年一个闰年计算,平均每年就要多算出 0.0078 天,经过四百年就会多出大约 3 天来,因此,每四百年中要减少三个闰年。闰年的计算,归结起来就是通常说的:四年一闰;百年不闰,四百年再闰 。

2.3 日期的格式

根据不同的语言文化,日期的连字符会有所不同,通常有以下几种格式:

yyyyMMdd

yyyy-MM-dd

yyyy/MM/dd

yyyy.MM.dd

3、日期正则表达式构建

3.1 规则分析

写复杂正则的一个常用方法,就是先把不相关的需求拆分开,分别写出对应的正则,然后组合,检查一下相互的关联关系以及影响,基本上就可以得出对应的正则。

按闰年的定义可知,日期可以有几种分类方法。

3.1.1 根据天数是否与年份有关划分为两类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值