闰年计算——JavaScript 语言计算
㈠闰年是如何来的?
闰年(Leap Year)是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。补上时间差的年份为闰年。
㈡什么是闰年?
凡阳历中有闰日(二月为二十九日)的年,或阴历中有闰月(一年有十三个月)的年;闰余(岁余置闰。阴历每年与回归年相比所差的时日)。
闰年共有366天(1-12月分别为31天,29天,31天,30天,31天,30天,31天,31天,30天,31天,30天,31天)。
㈢闰年分类
⑴平年为365天,闰年为366天
⑵闰年是公历中的名词。闰年分为普通闰年和世纪闰年。
⑶普通闰年:公历年份是4的倍数的,一般是闰年。
⑷世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年。
㈣简洁判断闰年的方法
★按一回归年365天5小时48分45.5秒。
⑴普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1901年不是闰年)
⑵世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)
⑶对于数值很大的年份,这年如果能整除3200一般不是闰年,但是如果能整除172800则是闰年。
如172800年是闰年,86400年不是闰年(因为虽然能整除3200,但不能整除172800)(此按一回归年365天5h48'45.5''计算)。
㈤闰年与闰月
㈥阳历闰年
⑴阳历闰年共有366天(1-12月分别为31天,29天,31天,30天,31天,30天,31天,31天,30天,31天,30天,31天),
⑵地球绕太阳运行周期为365天5小时48分46秒(合365.24219天)即一回归年(tropical year)。公历的平年只有365日,比回归年短约0.2422 日,所余下的时间约为四年累计一天,故四年于2月加1天,使当年的历年长度为366日,这一年就为闰年。现行公历中每400年有97个闰年。
⑶按照每四年一个闰年计算,平均每年就要多算出0.0078天,这样经过四百年就会多算出大约3天来,因此,每四百年中要减少三个闰年。所以规定,公历年份是整百数的,必须是400的倍数的才是闰年,不是400的倍数的,虽然是4的倍数,也是平年,这就是通常所说的: 四年一闰,百年不闰,四百年再闰。 例如,2000年是闰年,1900年则是平年。
㈦公历闰年
⑴农历闰年由于比平年(354天)多一个月,所以实际上为383天或者384天(具体闰哪个月是由节气情况决定的)。
⑵中国旧历农历作为阴阳历的一种,每月的天数依照月亏而定,一年的时间以12个月为基准,平年比一回归年少约11天。为了合上地球围绕太阳运行周期即回归年,每隔2到4年,增加一个月,增加的这个月为闰月。闰月加到哪个月,以农历历法规则推断,主要依照与农历的二十四节气相符合来确定。在加有闰月的那一年有13个月,历年长度为384或385日,这一年也称为闰年。如1984年鼠年的农历中,有两个十月,通常成为前十月和后十月(即闰月)。农历闰年闰月的推算,3年一闰,5年二闰,19年七闰;农历基本上19年为一周期对应于公历同一时间。如公历的2001年5月27日、1982年5月27日和1963年5月27日这个日子,都是闰四月初五。
⑶农历(即中国的阴历)的历月是以朔望月为依据的。朔望月的时间是29日12小时44分3秒(即29.5366日),因此农历是大月30天,小月29天。农历是基本上以12个月作为一年的,但12个朔望月的时间是354.3667日,和回归年比起来要相差11天左右。这样每隔3年就要多出33天,即大约多出一个多月。 为了要把多余的日数消除,每隔3年就要加一个月,这就是农历的闰月。有闰月的一年也叫闰年,所以民间又有“三年两闰,三年两不闰”的说法。所以农历的闰年就有13个月了。至于闰哪个月是由节气情况决定的。
㈧计算方法
☀文字叙述
⑴按一回归年365天5h48'45.5''计算
⑵一年日数必须是整数,不便将零时数计入,所以取365天为一年,则余5时48分46秒
⑶积至4年约满一 日,所以4年一“闰日”,谓之“闰年”,无“闰日”之年为平年,即平年365天,闰年366天
⑷但到4年之时,仅有23时15分4秒闰一日。 但是欠缺44分56秒
⑸积至100年(25闰)时就欠缺18时43分20秒,约合3 / 4日,所以满100年不闰
⑹此时又余5时16分40秒,积至400年余21时6分40秒又闰
⑺又欠缺2时53分20秒,积至3200年计欠缺23时6分40秒,所以满3200年不闰
⑻此时又余53分20秒,积至86400年刚好24 时又一闰,这是不余不欠。
所以:判定公历闰年应遵循的一般规律为:四年一闰,百年不闰,四百年再闰.
★数学公式计算
function isLeapYear(year){ if((year/4==Math.floor(year/4)&&year/100!=Math.floor(year/100))||(year/400==Math.floor(year/400)&&year/3200!=Math.floor(year/3200))||year/172800==Math.floor(year/172800)){ return true } return false }