用python的基礎if-else寫一個判斷閏年的程式

KevinLuo
6 min readOct 24, 2021

--

‎一:什麼是閏年‎

‎關於公歷閏年是這樣規定的:地球繞太陽公轉一周叫做一回歸年,一回歸年長365日5時48分46秒。 ‎(沒錯多出了我們平常所知的5時48分46秒)。

因此,公歷規定有平年和閏年,平年一年有365日,比回歸年短0.242199日,一般用四位小數計算,及0.2422,四年共短0.9688日,故每四年增加一日,並且把這多出了的一天放到二月份,所以閏年的二月份有29天,這一天也叫閏日,這一年共有366日,就是閏年。 但四年增加一日比四個回歸年又多0.0312日,400年后將多3.12日,故在400年中少設3個閏年,也就是在400年中只設97個閏年,這樣公歷年的平均長度與回歸年就相近似了。 由此規定:年份是整百數的必須是400的倍數才是閏年,例如1900年、2100年就不是閏年。‎

‎也就我們居住的地球總是繞著太陽旋轉的。 地球繞太陽轉一圈需要365天5時48分46秒,也就是365.2422天。 為了方便,一年定為365天,叫做平年;這樣每過四年差不多就要多出一天來,把這一天加在2月裡,這一年就有366天,叫做閏年。 ‎
‎通常,每四年裡有三個平年一個閏年。 公歷年份是4的倍數的,一般都是閏年。 ‎

‎按照每四年一個閏年計算,平均每年就要多算出0.0078天,這樣經過四百年就會多算出大約3天來,因此,每四百年中要減少三個閏年。 所以規定,公歷年份是整百數的,必須是400的倍數的才是閏年,不是400的倍數的就是平年。 ‎

也就是我們通常所說的:
四年一閏,百年不閏,四百年再閏。

那我們按照上面四年一閏,百年不閏,四百年再閏的規則畫一張if-else的邏輯圖,然侯再寫程式。圖如下

用是否整除4, 是否整除100, 是否整除400來當判斷閏年的邏輯依據。

可看到若整除4且不整除100或整除4且整除100且整除400才是閏年!

那我們接下來就照著上面的規則來寫程式。(整除4且不整除100或整除4且整除100且整除400)

if year % 4 == 0 and year % 100 != 0:
print(f’{year} is a leap year.’)
elif year % 4 == 0 and year % 100 == 0 and year % 400==0:
print(f’{year} is a leap year.’)
else:
print(f’{year} is a not leap year.’)

對,就是那麼簡單就能寫出來判斷閏年的程式XD

再給些example:

e.g. The year 2000:

2000 ÷ 4 = 500 (Leap)

2000 ÷ 100 = 20 (Not Leap)

2000 ÷ 400 = 5 (Leap!)

So the year 2000 is a leap year.

But the year 2100 is not a leap year because:

2100 ÷ 4 = 525 (Leap)

2100 ÷ 100 = 21 (Not Leap)

2100 ÷ 400 = 5.25 (Not Leap)

二:數學中計算閏年的方法

一般的在數學運算中,或者在公歷紀年法中,能被4整除的大多是閏年,除了那些能被100整除而不能被400整除的年份以外。

①非世紀年能被4整除,且不能被100整除的是閏年。(如2004年是閏年,1901年不是閏年)
②世紀年能被400整除的是閏年。(如2000年少閏年,1900年不是閏年)

三:閏年的差值計算

現時的公歷以回歸年為“年”的計算基礎,而一個回歸年大約等於365.24220日。因為在平年公歷只計算365日,結果四年后便會累積0.24220×4=0.9688日,大約等於一日,所以便逢四年增加一日閏日以抵銷這0.9688日。但是還是稍微的少了點,這樣一時沒有多少時間,可是到了一個百年時就會相差了大約0.78天,即多加了。所以要再次規定細節,到100年是不在加,這樣又會每100年的時間少了0.22天,到了400年時,差了大約0.9天了,所以那個百年是要再加上潤日才可以基本對應的。但是這樣仍然會有些許的誤差,但是已經相當的小了。我們只是大致進行了計算,實際的是相差很小很小的,微乎其微的,但是日積月累卻可以百年出“日”的不起眼的小數上。下面就讓每我們一起來計算一下這個差值:
使用實際時間計算:
一個回歸年大約是:365日5時48分46秒,我們把不足一天的時間轉換成秒數:5×3600+48×60+46=20926秒
而一天的秒數是:24×3600=86400秒
我們通常計算的是以400年為一個循環,也就是前面所說的:四年一閏,百年不閏,四百年再閏。
那麼400年的時間總共天數和多出的秒數:天數:365×400=146000天,多餘秒數:20926×400=8370400秒,
把多出來的秒數轉換成天時分秒的形式:96天21小時6分40秒
然後把這個秒數轉換成天的小數:8370400/3600/24=96.87962963
數學計算中常用的數值:
我們通常在數值計算中用到一個回歸年是365.2422天
那麼400年的時間是多少呢?應該是365.2422×400,我們把這個計算式分解=>365×400+0.2422*400,其中365×400和前面的一樣,我們這就不再次計算,我們只算0.2422*400=96.88天
這個96.88天數減去實際天數96.87962963:96.88–96.87962963=0.00037037天
而0.00037037天轉換成秒:0.00037037×24×3600=31.999968秒,大約是32秒

可以參考這影片:

What is a Leap Year? — YouTube

結論:
通過以上數據的計算,我們可以看出每年以365.2422天計算400年為周期,和實際直接的差值是32秒,也就是400年大約有32秒的誤差。
但是我們實際計算400年都是按97個潤計算,也就是97天 — 96天21小時6分40秒=2小時53分20秒的誤差。
可能有人會問了,時間長了也是有誤差的啊?你說的對,咱們來計算一下誤差一天要經過多少年:每天的秒數是86400,除以32,然后再乘以400:86400/32*400=108000年,也就是要經過100多萬年會多出1天的誤差,在時間的長河中,人的有生之年相對於108萬年有這樣的誤差存在已經是微乎其微了,可以忽略不計了。就算以2小時53分20秒的誤差計算:400*86400/(2*3600+53*60+20)=3323.077年,也需要經過3000多年的時間會多出一天的時間誤差。
具體使用那個數值?需要精確度到多少?,使用哪一個數值取決於你自己了,我這裡只是告訴你各個數值之間的誤差僅此。

--

--

KevinLuo

知曉很多種資料處理,可BI或AI化的軟體和工具。主要用的程式語言是python和R 偶爾用C++ Ig:(可在上面找到我) AIA第九屆經理人班 立志當個厲害的podcaster!