天天看点

关于闰年的那些事儿

公历闰年

 小学时老师就教过每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,如需转载请自行联系原作者