複製鏈接
請複製以下鏈接發送給好友

閏年

(曆法中的名詞)

鎖定
陽曆和陰曆中有閏日的年份,或陰陽曆中有閏月的年份。如公曆2024年為閏年,2月有29天,全年366天;農曆癸卯年(2023年)為閏年,閏二月小,該月只有清明,無中氣,全年13個月。伊斯蘭教歷1428年(公曆2007——2008),全年366天為閏年。 [2] 
中文名
閏年
外文名
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年作《花卉圖》閏年開到十三回仿 張生鏞1925年作《花卉圖》閏年開到十三回仿
通常的解釋是説一年有多少天多少小時多少分鐘,取整數365天后,還有多餘的,累積達到一天(24小時)後,就多加一天,多加一天的這一年就是閏年。這個解釋只是告訴大家怎麼計算,是人為設置的東西。
最根本的原因是:地球繞太陽運行的週期為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年則是平年。 [1] 

閏年分類

閏年包括在公曆(格里曆)或夏曆中有閏日的年份和在中國農曆中有閏月的年份。
公曆閏年
《中華民俗萬年曆》 《中華民俗萬年曆》
地球繞太陽的運行週期為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年為平年,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年不是閏年)
地球公轉示意圖 地球公轉示意圖
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小時 [1]  =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年再閏。

閏年祖沖之與曆法

祖沖之改革曆法 祖沖之改革曆法
在古代,中國曆法家一向把十九年定為計算閏年的單位,稱為“一章”。在每一章裏有七個閏年。也就是説,在十九個年頭中,要有七個年頭是十三個月。這種閏法一直採用了一千多年,不過它還不夠周密、精確。直到公元412年,北涼趙厞創作了《元始歷》,才打破了歲章的限制,規定在六百年中間插入二百二十一個閏月。可惜的是,趙厞的改革並沒有引起當時人的注意,在著名曆法家何承天在公元443年製作《元嘉歷》時,還是採用了十九年七閏的古法
祖沖之吸取了趙厞的先進理論,加上他自己的觀察,認為十九年七閏的閏數過多,每二百年就要差一天,而趙厞六百年二百二十一閏的閏數卻又嫌稍稀,也不十分精密。因此,他提出了三百九十一年內一百四十四閏的新閏法,這個閏法在當時算是最精密的了。
除了改革閏法以外,祖沖之在曆法研究上的另一重大成就,是破天荒地應用了“歲差”。
祖沖之在曆法研究方面的第三個巨大貢獻,就是能夠求出曆法中通常稱為“交點月”的日數。
祖沖之根據上述的研究成果,終於成功製成了當時最科學、最進步的歷法——《大明曆》。這是祖沖之科學研究的天才結晶,也是他在天文曆法上的貢獻。

閏年閏年計算方法

精確計算方法
(按一回歸年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小時 [1]  =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)
假設某單元格輸入公曆年份,如輸入“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)
;
-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
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
.局部變量 年份, 整數型
' 是否是閏年
.如果真 ((年份 % 4 = 0 且 年份 % 100 ≠ 0) 或 (年份 % 400 = 0 且 年份 % 3200 ≠ 0) 或 年份 % 172800 = 0
)
    信息框 (“是閏年!”, 0, , )

// 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
}
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;

}
參考資料