闰年
闰年(leap year),在公历(格里历)或夏历中有闰日的年份,以及在中国旧历农历中有闰月的年份。地球绕太阳运行周期为365天5小时48分46秒(合365.24219天)即一回归年(tropical year)。公历的平年只有365日,比回归年短约0.2422 日,所余下的时间约为四年累计一天,于第四年加于2月,使当年的历年长度为366日,这一年就为闰年。[7]闰年
地球绕太阳一圈需要:365天5小时48分46秒,因为365天5小时48分46秒=365天6小时,为了方便,平年365天,所以为了补时间的差异,每隔4年有闰年,闰年366天,闰年的2月29天。[10]在公历(格里历)纪年中,有闰日的年份叫闰年,一般年份365天,闰年为366天。由于地球绕太阳运行周期为365天5小时48分46秒(合365.24219天)即一回归年,公历把一年定为365天。所余下的时间约为四年累计一天,加在二月里,所以平常年份每年365天,二月为28天,闰年为366天,二月为29天。[19]因此,每400年中有97个闰年,闰年在2月末增加一天,闰年366天。
中国旧历农历纪年中,有闰月的一年称为闰年。[6]一般年份为12个月,354或355天,闰年则为13个月,383或384天。农历作为阴阳历的一种,每月的天数依照月亏而定,一年的时间以12个月为基准;为了合上地球围绕太阳运行周期即回归年,每隔2到4年,增加一个月,增加的这个月为闰月,因此农历的闰年为13个月。[14]
农历没有第十三月的称谓,闰月按照历法规则,排放在从二月到十月的过后重复同一个月,重复的这个月为闰月,如四月过后的闰月称为闰四月。[11]
农历闰年闰月的推算,3年一闰,5年二闰,19年七闰;农历基本上19年为一周期对应于公历同一时间。如公历的2001年5月27日、1982年5月27日和1963年5月27日这个日子,都是闰四月初五。
闰月加到哪个月,以农历历法规则推断,主要依照与农历的二十四节气相符合来确定;农历的闰月天数与正常月份天数一样,为29或30天。农历所谓“闰”的说法,只有闰年和闰月称谓,公历也有闰年的称谓。
凡阳历中有闰日(2月29日)的年份,闰余(岁余置闰。阴历每年与回归年相比所差的时日)。[21]
1582年以来的置闰规则:
普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。
世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是闰年)。
1582年以前的惯例:四年一闰;如果公元A年的A(正数)能被4整除,那么它就是闰年;如果公元前B年的B(正数)除以4余1,那么它也是闰年。[15]
宋·苏轼《监洞霄宫俞康直郎中所居四咏 退圃》:“园中草木春无数,只有黄杨厄闰年。”
宋·陆游《蜗舍》诗:“麦因多雨损,蚕遇闰年迟。”
清·俞樾《茶香室丛钞·茨菰应闰月》:“茨菰一根,环十二子,闰年十三子。”
通常情况下,每4年会出现一次阳历闰年,每19年会有7次农历闰年,两个闰年一旦重合,就是双闰年了。
公历闰年计算
(按一回归年365天5小时48分45.5秒)
1、非整百年份:能被4整除的是闰年。(如2004年就是闰年,2001年不是闰年)
2、整百年份:能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)
3、对于数值很大的年份:如果这一年能被3200整除,那么这一年不是闰年,但如果这一年能被172800整除,则为闰年。如172800年是闰年,86400年不是闰年(因为虽然能被3200整除,但不能被172800整除)。(此按一回归年365天5h48'45.5''计算)
按一回归年365天5h48'45.5''计算:3200年多出16000小时153600分145600秒=18600小时26分40秒,现行公历中每400年有97个闰年,3200年共97*8=776个闰年=776*24小时 =18624小时>18600小时,所以只能算到775个闰年,3200不是闰年,于是775*24=18600,多出了26分40秒(共计1600秒),怎么办?需要经历多少个3200年的周期,足够弥补1天(86400秒)?答案是刚好54个周期(86400=1600*54),历时172800(=3200*54)年。
公元前闰年计算
根据闰年算法,公元4年是闰年,且周期是4年,如果公元有0年,即为闰年。因为公元没有0年,那么公元前1年就是闰年。
1、非整百年份:年数除以4,余数为1的年份是闰年。(如公元前1年、前5年、前9年是闰年)
2、整百年份:年数除以400,余数为1的年份是闰年。(如公元前401年、前801年是闰年)
3、对于数值很大的年份:年数除以3200,余数为1,那么这一年不是闰年;年数除以172800,余数为1,则为闰年。(如公元前172801年是闰年,前864001年不是闰年)
128年31闰置闰法
这一规则曾在19世纪提出,但不知何种原因,没被两教派采纳。比起400年3不闰和900年7不闰的规则,128年31闰更精确、更简便。
按现行的闰年规则,从2052年到2096年间的闰年与回归年的误差都会超过一天以上,如采用128年31闰规则,就不会这么早出现这种情况。
128年31闰的置闰方案的优点和实施方法:
1、采用128年31闰的置闰的方法,可以大大减少历年与回归年的误差,回归年的长度是365.24219879天,128年31闰的平均年长是365.2421875天。历年与回归年的平均误差每年不到一秒,是历法与回归年平均误差的1/27。
2、改历后与现历法衔接好,不需要过渡阶段。其方法如下:现历法继续使用,到2048年停闰,以后每128年不闰。新历法规则是:每四年一闰,凡公元年数能被128整除的年不闰。
3、此历法非常科学,它的置闰方法比现历法更简单,更符合天体的运行规律,现历法平均每年与回归年误差26秒,而此历法每年与回归年平均误差不到一秒。经计算,如果回归年按如今的长度计算,得八万多年,新历法与回归年的误差才超过一天。而现历法与回归年的误差3300年就超过一天。此历法好记、简单,便于计算,凡公元年数能被128整除的年就不闰。
闰年的计算
2017年,经过研究,闰年的计算应该如下:
口诀1:4年1闰,400年97闰,3200年(97*8-1)闰,86400年(27*(97*8-1)+1)闰(20926闰)
口诀2:4年1闰,128年31闰,86400年(675*31+1)闰(20926闰)
*************************************
一个回归年,H=(365*24*3600+5*3600+48*60+46)秒=31556926秒=15778463*2秒
1天 D=86400秒=43200*2秒
一个回归年=H/D天=15778463*2/(43200*2)天=365.2421990740740740740740740740....天
4年一闰:365*4+1=1461天=15778800/10800天
4个回归年为(15778463/43200)*4=15778463/10800天
4年一闰,公历比回归年时间多337/10800天
增加百年不闰、400年再闰的规则后:
400个公历年天数为365*400+97=146097天=15778476/108天
400个回归年为(15778463/43200)*400=15778463/108天
公历比回归年时间多13/108天
增加3200年不闰的规则后:
3200个公历年天数为365*3200+97*(3200/400)-1=1168775天=31556925/27天
3200个回归年为15778463*3200/43200=15778463*32/432=31556926/27天
公历比回归年时间少1/27天
增加86400年再闰的规则后:
86400个公历年天数为365*86400+(97*8-1)*(86400/3200)+1=365*86400+775*27+1=31556926=852037002/27天
86400个回归年为15778463*86400/43200=15778463*864/432=15778463*54/27=852037002/27天
公历比回归年时间少0天
增加128年不闰的规则后:
128个公历年天数为365*128+128/4-1=46751天=31556925/675天
128个回归年为(15778463/43200)*128=15778463*2/675天=31556926/675天
公历比回归年时间少1/675天
增加86400年再闰的规则后:
86400个公历年天数为365*86400+31*675+1=31556926天
86400个回归年为15778463*86400/43200=15778463*2=31556926天
公历比回归年时间少0天
结论:一天定义为24小时(86400秒),需要86400年一个循环才能消除公历和回归年的时间差。
口诀:4年1闰,128年不闰,86400年再闰。
闰年包括在公历(格里历)或夏历中有闰日的年份,和在中国农历中有闰月的年份。
公历闰年
闰年计算流程图
地球绕日运行周期为365天5小时48分46秒(合365.24219天),即一回归年(tropical year)。[12]公历的平年只有365日,比回归年短约0.2422 日,每四年累积约一天,把这一天加于2月末(即2月29日),使当年时间长度变为366日,这一年就为闰年。[5]现在的公历是根据罗马人的“儒略历”改编而得。由于当时没有了解到每年要多算出0.0078天的问题,从公元前46年,到16世纪,一共累计多出了10天。为此,当时的教皇格雷果里十三世,将1582年10月5日人为规定为10月15日。[20]并开始了新闰年规定。即规定公历年份是整百数的,必须是400的倍数才是闰年,不是400的倍数的就是平年。[4]此后,平均每年长度为365.2425天,约4年出现1天的偏差。[3]按照每四年一个闰年计算,平均每年就要多算出0.0078天,经过四百年就会多出大约3天来,因此,每四百年中要减少三个闰年。闰年的计算,归结起来就是通常说的:四年一闰;百年不闰,四百年再闰。[1]
由于地球的自转速度逐渐降低,而公转速度则相对更加稳定,所以上述的系统经过更长的周期也会发生微小的误差。据计算,每8000年会有一天的误差,所以英国的天文学家John Herschel提议公元4000为平年,以后类推12000年,20000年亦为平年。但此提议从未被正式采纳。原因是到了4000年,地球自转的精确速度并非现在可以预测,所以届时参照真实数据方可做出判断。因此,在长远的将来,针对闰年的微小调整应该不是由预定的系统决定,而是随时不定性的。
西方公历闰年
阳历中有闰日的年份叫闰年,相反就是平年,平年为365天,闰年为366天。[13]在公历(格里历)纪年中,平年的二月为28天,闰年的二月为29天。[17]闰年平月2月29日为闰日。[16]
中国农历闰年
中国旧历农历作为阴阳历的一种,每月的天数依照月亏而定,一年的时间以12个月为基准,平年比一回归年少约11天。为了合上地球围绕太阳运行周期即回归年,每隔2到4年,增加一个月,增加的这个月为闰月。闰月加到哪个月,以农历历法规则推断,主要依照与农历的二十四节气相符合来确定。在加有闰月的那一年有13个月,历年长度为384或385日,这一年也称为闰年。如1984年鼠年的农历中,有两个十月,通常成为前十月和后十月(即闰月)。
公历1982年至2042年与农历闰年闰月对照表
1982年5月23日闰四月小壬戊年 1984年11月23日闰十月大甲子年 1987年7月26日闰六月大丁卯年 1990年6月23日闰五月大庚午年 1993年4月22日闰三月大癸酉年 1995年9月25日闰八月大乙亥年 1998年6月24日闰五月小戊寅年 2001年5月23日闰四月大辛巳年 2004年3月21日闰二月大甲申年 2006年8月24日闰七月大丙戊年 2009年6月23日闰五月大己丑年 2012年5月21日闰四月小壬辰年 2014年10月24日闰九月小甲午年 2017年7月23日闰六月大丁酉年 2020年5月23日闰四月小庚子年 2023年3月22日闰二月大癸卯年 2025年7月25日闰六月大己巳年 2028年6月23日闰五月大戊申年 2031年4月22日闰三月大辛亥年 2033年8月25日闰七月大癸丑年 2036年7月23日闰六月小丙辰年 2039年6月22日闰五月大己未年 2042年3月22日闰二月大壬戊年 |
最长的农历闰年的天数可达385天,这样的农历闰年是很罕见的。从公元前221年至公元1900年的2120年里,一共只有9次。从公元1900年至公元4000年这2100年里出现了22次,出现的年份有:
1925年、1944年、2006年、2270年、2289年、2351年、2606年、2625年、2634年、2889年、2951年、2970年、3234年、3253年、3296年、3315年、3589年、3608年、3872年、3915年、3934年、3953年。
程序计算
WPS表格
=OR(AND(MOD(YEAR(单元格),4)=0,MOD(YEAR(单元格),100)<>0),MOD(YEAR(单元格),400)=0)
Excel表格
假设某单元格输入公历年份,如输入“1582”表示1582年,输入“2000”表示2000年,输入负数表示“公元前(相反数)年”,如输入“-222”表示公元前222年。
可以用如下公式计算给定年份的天数:
=IF(单元格=1582,355,IF(单元格<0,IF(MOD(单元格,4)=3,366,365),IF(单元格<1582,IF(MOD(单元格,4)=0,366,365),365+IF(MOD(单元格,4)=0,1,0)-IF(MOD(单元格,400)=0,0,1)+IF(MOD(单元格,100)=0,0,1))))
知道了给定年份的天数,自然就知道是不是闰年了。
比如说在单元格A1输入年份,公式就变成:
=IF(A1=1582,355,IF(A1<0,IF(MOD(A1,4)=3,366,365),IF(A1<1582,IF(MOD(A1,4)=0,366,365),365+IF(MOD(A1,4)=0,1,0)-IF(MOD(A1,400)=0,0,1)+IF(MOD(A1,100)=0,0,1))))
现实中一般碰到的年份,自然是无交集地晚于1582年的年份,这时给定年份的天数可以用这个公式:
=365+IF(MOD(单元格,4)=0,1,0)-IF(MOD(单元格,400)=0,0,1)+IF(MOD(单元格,100)=0,0,1)
Ecmascript语言
1 2 3 4 5 6 7 | // 判断指定年份是否为闰年 function isleap(){ var the_year = new Date().getFullYear(); var isleap = (the_year % 4 == 0 && the_year % 100 !=0) || (the_year % 400 ==0 && year % 3200 != 0) || year % 172800 == 0; return isleap; }
|
C#语言
1 2 3 4 5 6 7 8 9 10 | /// /// 判断指定年份是否为闰年 /// /// 年份 /// public static bool isLeapYear(int year) { return ((year % 4 == 0 && year % 100 != 0) || (year%400==0 && year % 3200 != 0) || year % 172800 == 0);
} |
Java语言
1 2 3 4 5 6 7 8 9 10 11 12 13 | import java.util.Scanner; public class LeapYear { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入年份:"); int year = input.nextInt();
if((year % 4 == 0 && year % 100 != 0) || (year%400==0 && year % 3200 != 0) || year % 172800 == 0) System.out.print(year + "年是闰年。"); else System.out.print(year + "年不是闰年。"); } } |
VB语言
1 2 3 4 5 6 7 8 9 | Private Sub Command1_Click() Dim a As Integer a = InputBox("请输入待判断年份") If (a Mod 4 = 0 And a Mod 100 <> 0) Or (a Mod 400 = 0 And a Mod 3200 <> 0) Or (a Mod 172800 = 0) Then MsgBox "是闰年!" Else MsgBox "不是闰年!" End If End Sub |
Python 语言
1 2 3 4 5 6 7 8 | # -*- coding: cp936 -*- temp = input("输入年份:") YEAR = int(temp) if (YEAR % 4 == 0 and YEAR % 100 != 0) or (YEAR % 400 == 0 and YEAR % 3200 != 0) or year % 172800 == 0 : print ("闰年") else: print ("非闰年") |
C++语言
1 2 3 4 5 6 7 8 9 10 11 | #include<iostream> int main() { int year; std::cout<<"请输入年份:"; std::cin>>year; //输入待判断年份,如2008 std::cout< ) ) == 1 ? "年是闰年" : "年是平年")< return 0; } |
scheme语言
1 2 3 4 5 6 7 8 9 10 11 | (define (闰年? 年份) (define (整除? x y) (= 0 (mod x y))) (cond ((or (and (整除? 年份 4) (not (整除? 年份 100))) (and (整除? 年份 400) (not (整除? 年份 3200))) (整除? 年份 172800)) #t) (else #f))) |
C语言
1 2 3 4 5 6 7 8 9 10 11 12 | #include int main(void) { int y; printf("请输入年份,回车结束\n"); scanf("%d",&y); if((y%4==0&&y%100!=0)||(y%400==0&&y%3200!=0)||y%172800==0) printf("%d是闰年\n",y); else printf("%d是平年\n",y); return 0; } |
MATLAB语言
1 2 3 4 5 6 | function lpflag = isleapyear(year) % 判断是否为闰年 % Input -year 年份,数值 % Output -lpflag lpflag = 1,闰年;lpflag = 0,平年 lpflag = (~mod(year, 4) && mod(year, 100)) || (~mod(year, 400) && mod(year, 3200)) || ~mod(year, 172800) ; |
Erlang语言
1 2 3 4 5 6 7 8 9 | -module(year). -export([isLeap/1]). isLeap(Year) -> if Year rem 3200 /= 0 and Year rem 400 == 0 -> true; Year rem 100 /= 0 and Year rem 4 == 0 -> true; Year rem 172800 == 0 ->true; true -> false end. |
Bash/Shell
1 2 3 4 5 6 7 8 | year=$1 if [ "$(( $year % 4 ))" == "0" ] && [ "$(( $year % 100 ))" != "0" ] || [ "$(( $year % 400 ))" == "0" ] && [ "$(( $year % 3200 ))" != "0" ] || [ "$(( $year % 172800 ))" == "0" ]
then echo "leap year" else echo "common year" fi |
易语言
1 2 3 4 5 | .局部变量 年份, 整数型 ' 是否是闰年 .如果真 ((年份 % 4 = 0 且 年份 % 100 ≠ 0) 或 (年份 % 400 = 0 且 年份 % 3200 ≠ 0) 或 年份 % 172800 = 0 ) 信息框 (“是闰年!”, 0, , ) |
Go语言
1 2 3 4 5 6 7 8 | // IsLeapYear 检查传入的年份是否是闰年 func IsLeapYear(year int) bool { if (year%4 == 0 && year%100 != 0) || (year%400 == 0 && year%3200 != 0) || year%172800 == 0 { return true } return false } |
JavaScript语言
1 2 3 4 5 6 | 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 } |
精确计算方法
(按一回归年365天5小时48分45.5秒)
①、普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1901年不是闰年)
②、世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)
③、对于数值很大的年份,这年如果能整除3200,并且能整除172800则是闰年。如172800年是闰年,86400年不是闰年(因为虽然能整除3200,但不能整除172800)(此按一回归年365天5h48'45.5''计算)。
此外,如依照现有太阳年的长度与上述闰年规则,每8000年又约差一日,因此约翰·赫歇尔提议每逢4000的倍数不闰,如西元4000年。但距此一年份来临尚有约二千年之遥,因此还未曾真正纳入规则或实施过。又由于地球公转速率的不稳定与众多影响因素,届时是否需要纳入此规则仍有疑问。
原因:若一年按365天5h48'46''(此时86400年也是闰年)计算,一年日数必须是整数,不便将零时数计入,所以取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 时又一闰,这是不余不欠,需重计算,所以按阳历计算就有上面的闰年规则。
按一回归年365天5h48'45.5''计算:3200年多出16000小时153600分145600秒 =18600小时26分40秒,共32*24+8=136个闰年=776*24=18624小时 >18600小时,所以只能算到775个闰年,3200不是闰年,于是775*24=18600,多出了26分40秒怎么办需要多少个周期弥补?答案是54个周期,为172800年,因为172800/3200=54个周期 54*26分40秒=1404分2160秒=24小时。
祖冲之改革
在古代,我国历法家一向把十九年定为计算闰年的单位,称为“一章”,在每一章里有七个闰年。也就是说,在十九个年头中,要有七个年头是十三个月。这种闰法一直采用了一千多年,不过它还不够周密、精确。公元412年,北凉赵厞创作《元始历》,才打破了岁章的限制,规定在六百年中间插入二百二十一个闰月。可惜赵厞的改革没有引起当时人的注意,例如著名历算家何承天在公元443年制作《元嘉历》时,还是采用十九年七闰的古法。祖冲之吸取了赵厞的先进理论,加上他自己的观察,认为十九年七闰的闰数过多,每二百年就要差一天,而赵厞六百年二百二十一闰的闰数却又嫌稍稀,也不十分精密。因此,他提出了三百九十一年内一百四十四闰的新闰法,这个闰法在当时算是最精密的了。[9]除了改革闰法以外,祖冲之在历法研究上的另一重大成就,是破天荒第一次应用了“岁差”。”祖冲之在历法研究方面的第三个巨大贡献,就是能够求出历法中通常称为“交点月”的日数。祖冲之根据上述的研究成果,终于成功制成了当时最科学、最进步的历法——《大明历》。[18]这是祖冲之科学研究的天才结晶,也是他在天文历法上最卓越的贡献。
[1] 2020年和即将到来的鼠年都是闰年,网友:终于轮到我过生日了2020-01-02T11:18:06+08:00[引用日期2022-05-17 20:26:57]
[2] 庚子鼠年需“多上一个月班”?听听“科学”流言榜怎么说2020-01-21T16:06:27+08:00[引用日期2022-05-17 20:54:16]
[3] 今年农历全年有384天 省天文学会专家详解农历闰月2020-02-29T08:38:17+08:00[引用日期2022-05-17 20:54:31]
[4] 四年一回的生日咋过?一起为新疆这50多位寿星庆生!2016-02-28T21:00:34+08:00[引用日期2022-05-17 20:56:23]
[5] 2020年是“双闰年”,是什么意思?为什么会这样?2020-01-08T18:40:27+08:00[引用日期2022-05-17 21:11:35]
展开
Copyright 2023 fuwu029.com赣ICP备2022008914号-4