闰年

闰年

目录导航

闰年出处

张生镛1925年作《花卉图》闰年开到十三回仿张生镛1925年作《花卉图》闰年开到十三回仿宋·苏轼《监洞霄宫俞康直郎中所居四咏 退圃》:“园中草木春无数,只有黄杨厄闰年。”

宋·陆游《蜗舍》诗:“麦因多雨损,蚕遇闰年迟。”

张生镛1925年作《花卉图》闰年开到十三回仿

清·俞樾《茶香室丛钞·茨菰应闰月》:“茨菰一根,环十二子,闰年十三子。”

历算法家

在古代,中国历法家一向把十九年定为计算闰年的单位,称为“一章”,在每一章里有七个闰年。也就是说,在十九个年头中,要有七个年头是十三个月。这种闰法一直采用了一千多年,不过它还不够周密、精确。公元412年,北凉赵厞创作《元始历》,才打破了岁章的限制,规定在六百年中间插入二百祖冲之改革历法祖冲之改革历法二十一个闰月。可惜赵厞的改革没有引起当时人的注意,例如著名历算家何承天在公元443年制作《元嘉历》时,还是采用十九年七闰的古法。

祖冲之吸取了赵厞的先进理论,加上他自己的观察,认为十九年七闰的闰数过多,每二百年就要差一天,而赵厞六百年二百二十一闰的闰数却又嫌稍稀,也不十分精密。因此,他提出了三百九十一年内一百四十四闰的新闰法,这个闰法在当时算是最精密的了。

除了改革闰法以外,祖冲之在历法研究上的另一重大成就,是破天荒第一次应用了“岁差”。

”祖冲之在历法研究方面的第三个巨大贡献,就是能够求出历法中通常称为“交点月”的日数。

祖冲之根据上述的研究成果,终于成功制成了当时最科学、最进步的历法——《大明历》。这是祖冲之科学研究的天才结晶,也是他在天文历法上最卓越的贡献。

闰年规则

闰年闰年使用的格里高利历闰年规则如下:

公元年分除以4不可整除,为平年。

公元年分除以4可整除但除以100不可整除,为闰年。

公元年分除以100可整除但除以400不可整除,为平年。

公元年分除以400可整除,为闰年。

凡阳历中有闰日(2月29日)的年份,闰余(岁余置闰。阴历每年与回归年相比所差的时日)。

1582年以来的置闰规则:

普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。

世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是闰年)。

1582年以前的惯例:四年一闰;如果公元A年的A(正数)能被4整除,那么它就是闰年;如果公元前B年的B(正数)除以4余1,那么它也是闰年。

产生原因

通常的解释是说一年有多少天多少小时多少分,取整数365还有多余的,累积达到一天24小时后,就多加一天的年是闰年。这个解释只是告诉了大家怎么计算,是人为设置的东西。

最根本的原因是:地球绕太阳运行周期为365天5小时48分46秒(合365.24219天)即一回归年(tropical year)。公历的平年只有365日,比回归年短约0.2422 日,所余下的时间约为每四年累计一天,故第四年于2月末加1天,使当年的历年长度为366日,这一年就为闰年。现行公历中每400年有97个闰年。按照每四年一个闰年计算,平均每年就要多算出0.0078天,这样经过四百年就会多算出大约3天来。因此每四百年中要减少三个闰年。所以公历规定:年份是整百数时,必须是400的倍数才是闰年;不是400的倍数的世纪年,即使是4的倍数也不是闰年。

这就是通常所说的:四年一闰,百年不闰,四百年再闰。 例如,2000年是闰年,2100年则是平年。

相关分类

闰年包括在公历(格里历)或夏历中有闰日的年份,和在中国农历中有闰月的年份。

公历闰年

地球绕太阳运行周期为365天5小时48分46秒(合365.24219天),即一回归年(tropical year)。公历的平年只有365日,比回归年短约0.2422 日,每四年累积约一天,把这一天加于2月末(即2月29日),使当年时间长度变为366日(1-12月分别为31天,29天,31天,30天,31天,30天,31天,31天,30天,31天,30天,31天),这一年就为闰年。需要注意的是,公历是根据罗马人的“儒略历”改编而《中华民俗万年历》《中华民俗万年历》得。由于当时没有了解到每年要多算出0.0078天的问题,从公元前46年,到16世纪,一共累计多出了10天。为此,当时的教皇格列高利十三世,将1582年10月5日人为规定为10月15日。并开始了新闰年规定。即规定公历年份是整百数的,必须是400的倍数才是闰年,不是400的倍数的就是平年。比如,1700年、1800年和1900年为平年,2000年为闰年。此后,平均每年长度为365.2425天,约4年出现1天的偏差。按照每四年一个闰年计算,平均每年就要多算出0.0078天,经过四百年就会多出大约3天来,因此,每四百年中要减少三个闰年。闰年的计算,归结起来就是通常说的:四年一闰;百年不闰,四百年再闰。

1950-2050年间的闰年:

1952、1956、1960、1964、1968、1972、1976、1980、1984、1988、1992、1996、2000、2004、2008、2012、2016、2020、2024、2028、2032、2036、2040、2044、2048。

由于地球的自转速度逐渐降低,而公转速度则相对更加稳定,所以上述的系统经过更长的周期也会发生微小的误差。据计算,每8000年会有一天的误差,所以英国的天文学家约翰·赫歇耳提议公元4000为平年,以后类推12000年,20000年亦为平年。但此提议从未被正式采纳。原因是到了4000年,地球自转的精确速度并非如今可以预测,所以届时参照真实数据方可做出判断。因此,在长远的将来,针对闰年的微小调整应该不是由预定的系统决定,而是随时不定性的。

农历闰年

中国旧历农历作为阴阳历的一种,每月的天数依照月亏而定,一年的时间以12个月为基准,平年比一回归年少约11天。为了合上地球围绕太阳运行周期即回归年,每隔2到4年,增加一个月,增加的这个月为闰月。闰月加到哪个月,以农历历法规则推断,主要依照与农历的二十四节气相符合来确定。在加有闰月的那一年有13个月,历年长度为383至385日,这一年也称为闰年。如1984年鼠年的农历中,有两个十月,通常成为前十月和后十月(即闰月)。农历闰年闰月的推算,3年一闰,5年二闰,19年七闰;农历基本上19年为一周期对应于公历同一时间。如公历的2001年5月27日、1982年5月27日和1963年5月27日这个日子,都是闰四月初五。

超长农历

最长的农历闰月年份的天数可长达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年。

平年超短农历年只有353天,公示元年至公元5000年之间,农历年有353天的年份只有以下9个:

780年、1620年、1965年、2372年、3620年、3903年、3965年、4186年、4248年。

公历1982年至2042年与农历闰年闰月对照表:

1982年5月23日 闰四月小 壬戊年 2014年10月24日 闰九月小 甲午年
1984年11月23日闰十月小 甲子年 2017年7月23日 闰六月大 丁酉年
1987年7月26日 闰六月小 丁卯年 2020年5月23日 闰四月小 庚子年
1990年6月23日闰五月小 庚午年 2023年3月22日 闰二月小 癸卯年
1993年4月22日 闰三月小 癸酉年 2025年7月25日 闰六月小 乙巳年
1995年9月25日 闰八月小 乙亥年 2028年6月23日 闰五月小 戊申年
1998年6月24日 闰五月小戊寅年 2031年4月22日 闰三月小 辛亥年
2001年5月23日 闰四月小 辛巳年 2033年8月25日 闰冬月小 癸丑年
2004年3月21日 闰二月小 甲申年 2036年7月23日 闰六月大 丙辰年
2006年8月24日 闰七月小 丙戊年 2039年6月22日 闰五月小 己未年
2009年6月23日 闰五月小己丑年 2042年3月22日 闰二月小 壬戊年
2012年5月21日 闰四月小 壬辰年

判定方法

1982年5月23日 闰四月小 壬戊年 2014年10月24日 闰九月小 甲午年
1984年11月23日闰十月小 甲子年 2017年7月23日 闰六月大 丁酉年
1987年7月26日 闰六月小 丁卯年 2020年5月23日 闰四月小 庚子年
1990年6月23日闰五月小 庚午年 2023年3月22日 闰二月小 癸卯年
1993年4月22日 闰三月小 癸酉年 2025年7月25日 闰六月小 乙巳年
1995年9月25日 闰八月小 乙亥年 2028年6月23日 闰五月小 戊申年
1998年6月24日 闰五月小戊寅年 2031年4月22日 闰三月小 辛亥年
2001年5月23日 闰四月小 辛巳年 2033年8月25日 闰冬月小 癸丑年
2004年3月21日 闰二月小 甲申年 2036年7月23日 闰六月大 丙辰年
2006年8月24日 闰七月小 丙戊年 2039年6月22日 闰五月小 己未年
2009年6月23日 闰五月小己丑年 2042年3月22日 闰二月小 壬戊年
2012年5月21日 闰四月小 壬辰年

公历闰年计算

公元前闰年计算

(按一回归年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秒,共32*24+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日。历年与回归年的平均误差每年不到一秒,是历法与回归年平均误差的27分之一。

2、改历后与现历法衔接好,不须要过渡阶段。其方法如下:现历法继续使用,到2048年停闰,以后每加128年既不闰。新历法规则是:每四年一闰,凡公元年数能被128整除的年不闰。

3、此历法非常科学,它的置闰方法比现历法更简单,更符合天体运行规律,现历法平均每年与回归年误差26秒,而此历法每年与回归年平均误差不到一秒。经计算,如果回归年按如今长度计算,得八万多年,新历法与回归年的误差才能超过一日。而现历法与回归年的误差3300年即超过一日。此历法好记简单,便于历算,凡公元年数能被128整除的年不闰。

精确计算方法

2017年经过研究,闰年的计算应该如下:

口诀1:4年1闰,100年不闰,400年再闰,3200年不闰,86400年再闰

口诀2:4年1闰,128年不闰,86400年再闰

*************************************

口诀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天

结论:一天定义24小时即86400秒,需要86400年一个循环才能消除公历和回归年时间差。

口诀:4年1闰,100年不闰,400年再闰,3200年不闰,86400年再闰

*******************************

(365*24*3600+5*3600+48*60+46)=31556926秒(15778463*2)

1天=86400秒;(43200*2)

一个回归年等于15778463/43200天=365.2421990740740740740740740740....天

4年一闰:365*4+1=1461天=15778800/10800天

4个回归年为(15778463/43200)*4=15778463/10800天

4年一闰,公历比回归年时间多337/10800天

增加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分45.5秒)

①、普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1900年不是闰年)

②、世纪年能被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小时。

词条图册

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语言

1234567     // 判断指定年份是否为闰年       function isleap(){           var the_year = new Date().getFullYear();           var isleap = (the_year % 4 == 0 && the_year % 100 !=0) || (the_year % 400 ==0 && the_year % 3200 != 0) || the_year % 172800 == 0;           return isleap;       }

C#语言

12345678910         /// <summary>        /// 判断指定年份是否为闰年        /// </summary>        /// <param name="year">年份</param>        /// <returns>返回布尔值true为闰年,反之不是</returns>        public static bool isLeapYear(int year)        {            return ((year % 4 == 0 && year % 100 != 0) || (year%400==0 && year % 3200 != 0) || year % 172800 == 0);         }

Java语言

12345678910111213 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语言

123456789 Private Sub Command1_Click()Dim a As Integera = 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 IfEnd Sub

Python 语言

12345678 # -*- 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++语言

1234567891011 #include<iostream>int main(){    int year;    std::cout<<"请输入年份:";    std::cin>>year;             //输入待判断年份,如2008    std::cout<<year<<(((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0 && year % 3200 != 0) || year % 172800 == 0)) == 1 ? "年是闰年" : "年是平年")<<std::endl;    return 0;}

scheme语言

1234567891011 (define (闰年? 年份)  (define (整除? x y)    (= 0 (mod x y)))  (cond ((or       (and (整除? 年份 4)           (not (整除? 年份 100)))      (and (整除? 年份 400)           (not (整除? 年份 3200)))      (整除? 年份 172800))     #t)    (else #f)))

C语言

123456789101112 #include <stdio.h>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语言

123456 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语言

123456789 -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

12345678 year=$1if [ "$(( $year % 4 ))" == "0" ] && [ "$(( $year % 100 ))" != "0" ] || [ "$(( $year % 400 ))" == "0" ] && [ "$(( $year % 3200 ))" != "0" ] || [ "$(( $year % 172800 ))" == "0" ]  then    echo "leap year"else    echo "common year"fi

易语言

12345 .局部变量 年份, 整数型' 是否是闰年.如果真 ((年份 % 4 = 0 且 年份 % 100 ≠ 0) 或 (年份 % 400 = 0 且 年份 % 3200 ≠ 0) 或 年份 % 172800 = 0)    信息框 (“是闰年!”, 0, , )

Go语言

12345678 // 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语言

123456 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}

Objective-C语言

1234567891011121314151617 -(NSInteger) daysCountOfMonth:(NSInteger) month andYear:(NSInteger) year { if((month == 1)||(month == 3)||(month == 5)||(month == 7)||(month == 8)||(month == 10)||(month == 12))    return 31; if((month == 4)||(month == 6)||(month == 9)||(month == 11))    return 30; if(year%4==0 && year%100!=0)//普通年份,非100整数倍    return 29; if(year%400 == 0)//世纪年份    return 29; return 28; }

相关百科
返回顶部
产品求购 求购