完整日期正則表達式


正則表達式 日期匹配 閏年平年


需要對日期進行一個正則表達式匹配,想要找出一個能夠匹配所有情況的正則表達式。
網上這篇博客【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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM