公曆閏年
國小時老師就教過每4年就有一個閏年,但年份能被100整除時不閏,比如:2000年是閏年,因為其能被400整除,但1900年不是閏年,其能被4整除,但能被100整除。用php來實作這個算法就是:
/**
* 是否是閏年
*
* 四年一閏,百年不閏,四百年再閏
*
* @param int $year 年份
* @return bool
*/
function isLeapYear($year)
{
return $year % 400 == 0 || ($year % 4 == 0 && $year % 100 != 0);
}
$year = 2000;
var_dump(isLeapYear($year));
$year = 1900;
輸出結果:
bool(true)
bool(false)
為什麼100年不閏呢?
最根本的原因是:地球繞太陽運作周期為365天5小時48分46秒(合365.24219天)即一回歸年(tropical year)。公曆的平年隻有365日,比回歸年短約0.2422 日,所餘下的時間約為四年累計一天,故四年于2月加1天,使當年的曆年長度為366日,這一年就為閏年。現行公曆中每400年有97個閏年。按照每四年一個閏年計算,平均每年就要多算出0.0078天,這樣經過四百年就會多算出大約3天來,是以,每四百年中要減少三個閏年。是以規定,公曆年份是整百數的,必須是400的倍數的才是閏年,不是400的倍數的,雖然是100的倍數,也是平年,這就是通常所說的:四年一閏,百年不閏,四百年再閏。
農曆閏年
上面說的是公曆的閏年,在中國農曆裡也有閏年。在農曆中有閏月的年份稱為農曆閏年。閏月指的是陰曆中的一種現象,陰曆是按照月亮的圓缺即朔望月安排大月和小月,一個朔望月的長度是29.5306日,是月相盈虧的周期,陰曆規定,大月30天,小月29天,這樣一年12個月共354天,陰曆的月份沒有季節意義,這樣十二個朔望月構成農曆年,長度為29.5306×12=354.3672日,比回歸年365.2422日少10.88天(即将近11天),每個月少0.91天(近1天)。
很不幸的是,要用精确的程式來計算農曆的月天數,及置閏的月份比較麻煩,現在常用的辦法都是參照一些天文曆法資料來進行計算。尤其是節氣的時間更是需要精确的天文曆法來推算。
本文轉自 ustb80 51CTO部落格,原文連結:http://blog.51cto.com/ustb80/1040882,如需轉載請自行聯系原作者