-
闰年 编辑
阳历和阴历中有闰日的年份,或阴阳历中有闰月的年份。如公历2024年为闰年,2月有29天,全年366天;农历癸卯年(2023年)为闰年,闰二月小,该月只有清明,无中气,全年13个月。伊斯兰教历1428年(公历2007——2008),全年366天为闰年。
中文名:闰年
外文名:Leap Year;Bissextile Year;Intercalary Year
拼音:rùn nián
流行地域:全世界
置闰法则:四年一闰;百年不闰,四百年再闰
凡公历中有闰日(2月29日)的年份,阴阳历中有闰月的年份。
1582年以来公历的置闰规则:
普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。
世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是闰年)。
1582年以前的惯例:四年一闰;如果公元A年的A(正数)能被4整除,那么它就是闰年;如果公元前B年的B(正数)除以4余1,那么它也是闰年。
张生镛1925年作《花卉图》闰年开到十三回仿
最根本的原因是:地球绕太阳运行的周期为365天5小时48分46秒(合365.24219天),即一回归年(tropical year)。公历的平年只有365天,比回归年短约0.2422天,所余下的时间约为每四年累积一天,故在第四年的2月末加1天,使当年的时间长度变为366天,这一年就是闰年。现行公历中每400年有97个闰年。按照每四年一个闰年计算,平均每年就要多算出0.0078天,这样,每128年就会多算出1天,经过400年就会多算出3天多。因此,每400年中要减少3个闰年。所以公历规定:年份是整百数时,必须是400的倍数才是闰年;不是400的倍数的世纪年,即使是4的倍数也不是闰年。
这就是通常说的:四年一闰,百年不闰,四百年再闰。例如:2000年是闰年,2100年则是平年。
闰年包括在公历(格里历)或夏历中有闰日的年份和在中国农历中有闰月的年份。
公历闰年
《中华民俗万年历》
需要注意的是,公历是根据罗马人的“儒略历”改编而成的。由于当时没有了解到每年要多算出0.0078天的问题,从公元前46年到16世纪,一共累计多出了10天。为此,当时的教皇格列高利十三世,将1582年10月5日改为10月15日,并开始了新的闰年规定。即规定公历年份是整百数的,必须是400的倍数才是闰年,不是400的倍数的年份就是平年。比如,1700年、1800年为平年,2000年为闰年。此后,平均每年长度为365.2425天,约4年出现1天的偏差。按照每四年一个闰年计算,平均每年就要多算出0.0078天,经过400年就会多出大约3天来,因此,每400年中要减少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年。
公历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年12月22日 闰冬月小 癸丑年 |
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年不是闰年)
地球公转示意图
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年就是闰年。
判断规则 | 非整百年份 | 整百年份 | 数值很大的年份 |
---|---|---|---|
判断方法 | 年数除以4,余数为1的年份是闰年 | 年数除以400,余数为1的年份是闰年 | 年数除以3200,余数为1则为非闰年;年数除以172800,余数为1则为闰年 |
例子1 | 公元前1年、前5年、前9年是闰年 | 公元前401年、前801年是闰年 | 前864001年不是闰年;公元前172801年是闰年) |
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天
结论:一天定义为24小时(86400秒),需要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秒)
1.普通年份能被4整除,且不能被100整除的,是闰年。(如2004年就是闰年)
2.世纪年份能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)
3.对于数值很大的年份,这年如果能被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秒,现行公历中每400年有97个闰年,3200年共97*8=776个闰年=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语言
// 判断指定年份是否为闰年 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#语言
/// <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语言
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语言
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 语言
# -*- 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++语言
#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语言
(define (闰年? 年份) (define (整除? x y) (= 0 (mod x y))) (cond ((or (and (整除? 年份 4) (not (整除? 年份 100))) (and (整除? 年份 400) (not (整除? 年份 3200))) (整除? 年份 172800)) #t) (else #f)))
MATLAB语言
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语言
-module(year). -export(). 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
year=$1 if && || && || then echo "leap year" else echo "common year" fi
易语言
.局部变量 年份, 整数型 ' 是否是闰年 .如果真 ((年份 % 4 = 0 且 年份 % 100 ≠ 0) 或 (年份 % 400 = 0 且 年份 % 3200 ≠ 0) 或 年份 % 172800 = 0 ) 信息框 (“是闰年!”, 0, , )
Go语言
// 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语言
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语言
-(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; }
1、本站所有文本、信息、视频文件等,仅代表本站观点或作者本人观点,请网友谨慎参考使用。
2、本站信息均为作者提供和网友推荐收集整理而来,仅供学习和研究使用。
3、对任何由于使用本站内容而引起的诉讼、纠纷,本站不承担任何责任。
4、如有侵犯你版权的,请来信(邮箱:baike52199@gmail.com)指出,核实后,本站将立即删除。
下一篇 伊菲图斯
上一篇 奥林匹克运动会主办城市