完整日期正则表达式

正则表达式 日期匹配 闰年平年


需要对日期进行一个正则表达式匹配,想要找出一个能够匹配所有情况的正则表达式。
网上这篇博客【http://www.cnblogs.com/jay-xu33/archive/2009/01/08/1371953.html】说得挺不错的,大家可以借鉴参考。

1.年份分析

1.1 年份的相关概念

年份主要是有平年和闰年之别,平年有365天,闰年有366天。

为什么平年有365天和闰年有366天,而不是其他数字?

(1)首先,地球绕太阳公转一周的时间长度称为【一回归年】。一回归年换算成时间长度就是365天5时48分46秒,即365.02422天。为了方便,就取整数365天作为平年的天数。这里就说明了数字【365】的来源。

(2)平年一年有365日,比一回归年短0.2422日,四年共短0.9688日(约等于1),所以每4年增加1日,这一年有366日,就是闰年这里就解释了数字【366】的来源。

(3)闰年定义:上面说到每4年增加1日,这年有366天就是闰年。但每4年增加1日,这样年份天数比4个回归年又多0.0312日,400年后将多3.12日,故在400年中少设3个闰年,也就是在400年中只设97个闰年(如果按照原来每4年就有一个闰年的计算方式,则400年就有100个闰年),这样公历年的平均长度与回归年就相近似了。由此规定:年份是整百数的必须是400的倍数才是闰年,例如1300年不是闰年,1200年是闰年。

由此可知,4个年份数字(yyyy)满足【能被400整除】或【被4整除且不能被100整除】两个条件之一的,那一年就是闰年。其他年份就是平年。

1.2 年份的数字表示

常见的合法日期时间在一个有效范围内,这里我们取【0001年01月01日 00时00分00秒】到【9999年12月31日 23时59分59秒】。

(1)所有年份是从0001到9999,要注意不能出现四个数字同时为0的情况,即不能出现0000年,这是非法的年份数字。一个数字可以用d或[0-9]表示。

所有年份正则表达式:
[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} 

(2)闰年
根据闰年的定义将闰年分为两类:

  • 能被4整除但不能被100整除的年份。
    根据年份最后两位数字的变化规律,得到下面的正则匹配式子:
([0-9]{2})(0[48]|[2468][048]|[13579][26])
  • 能被400整除的年份。
    能被400整除的数最后两位肯定是00,我们只要保证前两位能被4整除即可,相应的正则表达式为:
(0[48]|[2468][048]|[13579][26])00

2.日期分析

日期主要就是每个月的天数不同,比较特殊的就是2月,平年2月28天,闰年2月有29天。其他月份在平年和闰年没有区别。

(1)月份为 1, 3, 5, 7, 8, 10, 12,天数范围为 01 - 31,正则表达式为:

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

(2)月份为 4, 6, 9, 11,天数范围为 01-30,正则表达式为:

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

(3)月份为 2,平年时的正则表达式为:

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

闰年时只要特地匹配29日那天即可,因为其他的日子都可以在平年的表达式里面匹配到,故为:

02-29

3.完整的年月日正则表达式

^((([0-9]{2})(0[48]|[2468][048]|[13579][26]))   #闰年,能被4整除但不能被100整除
|((0[48]|[2468][048]|[13579][26])00)   #闰年,能被400整除
-02-29)  #匹配闰年2月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}) #平年(0001-9999)
-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))   #月日,1、3、5、7、8、10、12月有31天
|((0[469]|11)-(0[1-9]|[12][0-9]|30))   #月日,4、6、9、11月有30天
|(02-(0[1-9]|[1][0-9]|2[0-8])))   #平年2月只有28天,月日表示为【02-01至02-28】

PS:如果还有加上时间的验证,那么就在上面日期的基础上加上【HH:mm:ss】的考虑。小时分为【00-12】或【00-23】两种情况,时间和分钟都是【00-59】。

参考文章:
http://www.cnblogs.com/jay-xu33/archive/2009/01/08/1371953.html
http://www.jb51.net/article/20753.htm
http://www.cnblogs.com/bit-by-bit/p/6703355.html
http://www.cnblogs.com/wyxy_czj/articles/1958221.html

原文地址:https://www.cnblogs.com/fefjay/p/6889193.html