-
閏年
(曆法中的名詞)
鎖定
- 中文名
- 閏年
- 外文名
- Leap Year;Bissextile Year;Intercalary Year
- 拼 音
- rùn nián
- 流行地域
- 全世界
- 置閏法則
- 四年一閏;百年不閏,四百年再閏
閏年基本解釋
1582年以來公曆的置閏規則:
普通閏年:公曆年份是4的倍數,且不是100的倍數的,為閏年(如2004年、2020年等就是閏年)。
世紀閏年:公曆年份是整百數的,必須是400的倍數才是閏年(如1900年不是閏年,2000年是閏年)。
閏年出處
作者 | 年代 | 詩文出處 | 內容 |
---|---|---|---|
俞樾 | 清 | 《茶香室叢鈔·茨菰應閏月》 | 茨菰一根,環十二子,閏年十三子 |
陸游 | 宋 | 《蝸舍》詩 | 麥因多雨損,蠶遇閏年遲 |
蘇軾 | 宋 | 《監洞霄宮俞康直郎中所居四詠 退圃》 | 園中草木春無數,只有黃楊厄閏年 |
閏年產生原因
通常的解釋是説一年有多少天多少小時多少分鐘,取整數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的倍數也不是閏年。
閏年分類
公曆閏年
地球繞太陽的運行週期為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年不是閏年)
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,餘數為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; }
- 參考資料
-
- 1. 什麼是平年?什麼是閏年?產生原因 .未來網.20130102[引用日期2016-08-24]
- 2. 閏年 .辭海網絡版[引用日期2023-03-01]