基本解釋 凡陽曆中有閏日(二月為二十九日)的年,閏余(歲余置閏。陰曆每年與回歸年相比所差的時日)。
出處 宋·
蘇軾 《監洞霄宮俞康直郎中所居四詠 退圃》:“園中草木春無數,只有黃楊厄閏年。”
宋·
陸游 《
蝸舍 》詩:“麥因多雨損,蠶遇閏年遲。”
清·
俞樾 《茶香室叢鈔·茨菰應閏月》:“茨菰一根,環十二子,閏年十三子。”
張生鏞1925年作《花卉圖》閏年開到十三回仿 產生原因 通常的解釋是說一年有多少天多少小時多少分,取整數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日 閏九月小 甲午年
2017年7月23日 閏六月大 丁酉年
1987年7月26日 閏六月小 丁卯年
2020年5月23日 閏四月小 庚子年
2023年3月22日 閏二月小 癸卯年
1993年4月22日 閏三月小 癸酉年
2025年7月25日 閏六月小 乙巳年
1995年9月25日 閏八月小 乙亥年
2028年6月23日 閏五月小 戊申年
2031年4月22日 閏三月小 辛亥年
2001年5月23日 閏四月小 辛巳年
2033年8月25日 閏冬月小 癸丑年
2004年3月21日 閏二月小 甲申年
2036年7月23日 閏六月大 丙辰年
2006年8月24日 閏七月小 丙戊年
2039年6月22日 閏五月小 己未年
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小時=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閏,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秒)
①、普通年能被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秒,現行公曆中每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小時。
程式計算 Ecmascript語言:
// 判斷指定年份是否為閏年 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#語言:
/// <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語言:
Public Function isLeapYear(year As Integer) As BooleanisLeapYear = (year Mod 4 = 0 And year Mod 100 <> 0) Or year Mod 400 = 0 Or (year Mod 3200 = 0 &And year Mod 172800 = 0)End Function Python 語言:
# -*- coding: cp936 -*-temp = input("輸入年份:")YEAR = int(temp)if (YEAR % 4 == 0 and YEAR % 100 != 0) or YEAR % 400 == 0 or (YEAR % 3200 == 0 and 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;}
C語言:
#include <stdio.h>int main(void){ int y; printf("請輸入年份,回車結束\n"); scanf("%d",&y); if((y%4==0&&y%100!=0)||y%400==0||(year%3200==0&&year%172800==0)) printf("%d是閏年\n",y); else printf("%d是平年\n",y); return 0;} 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/1]).isLeap(Year) -> if Year rem 400 == 0 -> true; Year rem 100 /= 0 and Year rem 4 == 0 -> true; Year rem 3200 == 0 and Year rem 172800 == 0 -> true; true -> false end. Bash/Shell:
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 易語言:
.局部變數 年份, 整數型' 是否是閏年.如果真 ((年份 % 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%3200 == 0 || (year%4 == 0 && year%172800 == 0) { return true } return false}