細恐至微,為什麼每個驚人bug都在閏年!

什麼是閏年

公曆閏年判定遵循的規律為:四年一閏、百年不閏、400年再閏。

中國舊曆農曆每月的天數依照月虧而定,一年的時間以12個月為基準,平年比一回歸年少約11天。為了合上地球圍繞太陽運行週期即迴歸年,每隔2到4年,增加一個月,增加的這個月為閏月。那麼閏年應該怎麼計算?

閏年的計算方法:

1、普通年能被4整除且不能被100整除的為閏年。(如2004年就是閏年)

2、世紀年能被400整除的是閏年。(如2000年是閏年)

3、對於數值很大的年份,這年如果能整除3200,並且能整除172800則是閏年。如172800年是閏年,86400年不是閏年(因為雖然能整除3200,但不能整除172800)(此按一回歸年365天5h48’45.5’'計算)。

那麼用算法來實現就是:

public static bool IsLeap(int yN)

{


if ((yN % 400 == 0 && yN % 3200 !=

|| (yN % 4 == 0 && yN % 100 !=

|| (yN % 3200 == 0 && yN % 172800 == 0))

return true;

else

return false;


}

細恐至微,居然有這樣一個bug

1880年到2020年中是閏年的有以下這些年份:

1880年、1884年、1888年、1892年、1896年、1904年、1908年、1912年、1916年、1920年、1924年、1928年、1932年、1936年、1940年、1944年、1948年、1952年、1956年、1960年、1964年、1968年、1972年、1976年、1980年、1984年、1988年、1992年、1996年、2000年、2004年、2008年、2012年、2016年、2020年。

於是我打開我的iphone手機看了一下1990年的日曆

1990在並不是閏年,2月份居然有29天

細恐至微,為什麼每個驚人bug都在閏年!

1900年有2月29日!看完後我整個感覺都不好了,開始懷疑人生。那一天的人們在幹嘛?

據說有人看到這裡,趕快看看自己的android手機(ps:確實沒毛病)

抽了根菸,情不自禁的我打開了熟悉的windows電腦,心裡默唸了一句"微軟大法好’。

熟悉的微軟終於沒有讓我失望

常見的認知錯誤

一年總是365天

2月總是28天

閏年時每四年一次

這些bug與閏年有關:

1、在一個日期值上加或減時間的代碼。尤其是加減1年或1個月的代碼

2、各種根據數據庫查詢結果生成的報表和圖標,月度和年度統計可能會少算1天

3、證書/密碼/密鑰/緩存 等的過期時間,可能會比預期的早了一天,或者可能設定了一個非法的過期時間

4、固定長度的數組。例如,一個長度為365的數組遇到閏年可能就不夠了,可能會數組越界。

5、UI組件,例如日曆、日期選擇組件,以及客戶端輸入校驗相關的代碼。

閏秒?

除了閏年,還有一個東西叫閏秒。

“閏秒”就是1分鐘有61秒, “跳秒”都安排在6月30日,或是12月31日的最後一瞬間。

細恐至微,為什麼每個驚人bug都在閏年!


最後,小編想說:我是一名python開發工程師,

整理了一套最新的python系統學習教程,

想要這些資料的可以關注私信小編“01”即可(免費分享哦)希望能對你有所幫助


分享到:


相關文章: