天天看點

java和javascript日期校驗和閏年問題分析和解決方案

地球繞太陽運作周期為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月。參考下表:

代碼示例:

java和javascript日期校驗和閏年問題分析和解決方案

2.1.1.2java的日期對象

java中提供了豐富的類,可以直接校驗日期,如果不能使用java的類庫校驗自定義的一些日期,也可以自己編寫規則進行校驗,參考javascript的方法。

更多參考java.util.date的api

java和javascript日期校驗和閏年問題分析和解決方案
java和javascript日期校驗和閏年問題分析和解決方案

    山寨做法,不推薦使用。

java和javascript日期校驗和閏年問題分析和解決方案

下面這個是摘錄自某系統中的正規表達式,格式化之後也很難了解。這個正規表達式隻考慮年數是4的倍數的年份,對于100的倍數的則存在問題,比如1900年、2100年就不是閏年,也會校驗通過,不能在系統中使用。

支援的格式為:

1)0012/02/29

2)2012/2/29

3)2012 02 29

4)2012 2 01

5)2100 2 1

java和javascript日期校驗和閏年問題分析和解決方案

代碼,參考javascript的date api

java和javascript日期校驗和閏年問題分析和解決方案

結果:

java和javascript日期校驗和閏年問題分析和解決方案

代碼,參考java的date對象api

java和javascript日期校驗和閏年問題分析和解決方案

2100-3-2

1.系統對于标準的日期輸入,盡量使用日期控件,隻能選擇,不能修改;對于可以手工輸入和修改的日期,需要增加校驗。

2.有些業務規則跟閏年有關,開發過程中一定要跟業務确認清楚,比如:有效期天數,碰到閏年的情況,每年的天數可能就有一天的差别。

java和javascript日期校驗和閏年問題分析和解決方案

大小: 33.3 kb

java和javascript日期校驗和閏年問題分析和解決方案

大小: 43.2 kb

java和javascript日期校驗和閏年問題分析和解決方案

大小: 33.4 kb

java和javascript日期校驗和閏年問題分析和解決方案

大小: 59.4 kb

java和javascript日期校驗和閏年問題分析和解決方案

大小: 53.9 kb

java和javascript日期校驗和閏年問題分析和解決方案

大小: 32.9 kb

java和javascript日期校驗和閏年問題分析和解決方案

大小: 12.3 kb

java和javascript日期校驗和閏年問題分析和解決方案

大小: 30.7 kb

java和javascript日期校驗和閏年問題分析和解決方案