且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

关于闰年的那些事儿

更新时间:2022-10-01 14:21:13

公历闰年

 小学时老师就教过每4年就有一个闰年,但年份能被100整除时不闰,比如:2000年是闰年,因为其能被400整除,但1900年不是闰年,其能被4整除,但能被100整除。用php来实现这个算法就是:


  1. /** 
  2.  * 是否是闰年 
  3.  * 
  4.  * 四年一闰,百年不闰,四百年再闰 
  5.  *  
  6.  * @param   int $year   年份 
  7.  * @return  bool 
  8.  */ 
  9. function isLeapYear($year
  10.     return $year % 400 == 0 || ($year % 4 == 0 && $year % 100 != 0); 
  11.  
  12. $year = 2000; 
  13. var_dump(isLeapYear($year)); 
  14.  
  15. $year = 1900; 
  16. var_dump(isLeapYear($year)); 

输出结果:


  1. bool(true) 
  2. 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,如需转载请自行联系原作者