地球繞太陽運作周期為365天5小時48分46秒(合365.24219天)即一回歸年。公曆的平年隻有365日,比回歸年短約0.2422 日,所餘下的時間約為四年累計一天,故四年于2月加1天,使當年的曆年長度為366日,這一年就為閏年。
現行公曆中每400年有97個閏年。按照每四年一個閏年計算,平均每年就要多算出0.0078天,這樣經過四百年就會多算出大約3天來,是以,每四百年中要減少三個閏年。是以規定,公曆年份是整百數的,必須是400的倍數的才是閏年,不是400的倍數的,雖然是4的倍數,也是平年,這就是通常所說的:四年一閏,百年不閏,四百年再閏。 例如,2000年是閏年,1900年則是平年。
由于地球的自轉速度逐漸降低,而公轉速度則相對更加穩定,是以上述的系統經過更長的周期也會發生微小的誤差。在長遠的将來,針對閏年的微小調整應該不是由預定的系統決定,而是随時不定性的。
既然是這樣,在系統開發過程中,是否需要判斷幾百年後的事情呢?沒有太大必要,如果一個系統能夠使用幾百年,也該壽終正寝了。
系統中常有三種做法,第一種是使用語言自身的日期對象特性,第二種就是将日期轉換為某一個特定的格式,然後拆分出來年月日,判斷年份、月份、日期。兩種方法在javascript和java中都适用,第二種方法不推薦。
另外一種,使用正規表達式來校驗,正規表達式通常非常複雜,難以了解,這種方法對100倍數閏年校驗存在隐患。
2.1.1.1javascript的日期對象
将指定的格式日期字元串轉換成标準的格式(比如yyyy-mm-dd),對年月日進行拆解,通過年月日參數生産date(年,月,日)對象,再得到date對象的年月日,和拆解之後的年月日進行比較,看結果是否一緻。
通過date(年,月,日)建立對象,會自動轉換非法日期,比如:傳入1月和32号的日期,會自動更新為2月1日,比較年月日不一緻說明日期非法。
date對象的構造方法,月份是從0開始的,0表示1月。參考下表:
代碼示例:

2.1.1.2java的日期對象
java中提供了豐富的類,可以直接校驗日期,如果不能使用java的類庫校驗自定義的一些日期,也可以自己編寫規則進行校驗,參考javascript的方法。
更多參考java.util.date的api
山寨做法,不推薦使用。
下面這個是摘錄自某系統中的正規表達式,格式化之後也很難了解。這個正規表達式隻考慮年數是4的倍數的年份,對于100的倍數的則存在問題,比如1900年、2100年就不是閏年,也會校驗通過,不能在系統中使用。
支援的格式為:
1)0012/02/29
2)2012/2/29
3)2012 02 29
4)2012 2 01
5)2100 2 1
代碼,參考javascript的date api
結果:
代碼,參考java的date對象api
2100-3-2
1.系統對于标準的日期輸入,盡量使用日期控件,隻能選擇,不能修改;對于可以手工輸入和修改的日期,需要增加校驗。
2.有些業務規則跟閏年有關,開發過程中一定要跟業務确認清楚,比如:有效期天數,碰到閏年的情況,每年的天數可能就有一天的差别。
大小: 33.3 kb
大小: 43.2 kb
大小: 33.4 kb
大小: 59.4 kb
大小: 53.9 kb
大小: 32.9 kb
大小: 12.3 kb
大小: 30.7 kb