1、闰年的含义闰年(leap year)是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。补上时间差的年份为闰年。
闰年共有366天(31,29,31,30,31,30,31,31,30,31,30,31)。
2、闰年的判定方法判定公历闰年遵循的一般规律为:四年一闰,百年不闰,四百年再闰.
公历闰年的精确计算方法:(按一回归年365天5小时48分45.5秒)
①、普通年能被4整除的为闰年。(如2004年就是闰年,1901年不是闰年)
②、世纪年能被400整除而不能被3200整除的为闰年。(如2000年是闰年,3200年不是闰年)
③、对于数值很大的年份能整除3200,但同时又能整除172800则又是闰年.(如172800年是闰年,86400年不是闰年)
又若按照 :(按一回归年365天5小时48分46秒)闰年规则如下:
①、普通年能被4整除而不能被100整除的为闰年。(如2004年就是闰年,1900年不是闰年)
②、世纪年能被400整除而不能被3200整除的为闰年。(如2000年是闰年,3200年不是闰年)
③、对于数值很大的年份能整除3200,但同时又能整除86400则又是闰年.(如86400年是闰年)
原因:一年按365天5h48'46''计算,一年日数必须是整数,不便将零时数计入,所以取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小时。
公元前闰年规则如下:
1,非整百年:年数除4余数为1是闰年,即公元前1、5、9……年;
2,整百年:年数除400余数为1是闰年,年数除3200余数为1,不是闰年,年数除172800余1又为闰年,即公元前401、801……年。
【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整除的年不闰。
3、不同历法中的闰年闰年包括在公历(格里历)或夏历中有闰日的年份,和在中国农历中有闰月的年份。
3.1 公历中的闰年
地球绕日运行周期为365天5小时48分46秒(合365.24219天),即一回归年(tropical year)。公历的平年只有365日,比回归年短约0.2422 日,每四年累积约一天,把这一天加于2月末(即2月29日),使当年时间长度变为366日,这一年就为闰年。
需要注意的是,现在的公历是根据罗马人的"儒略历"改编而得。由于当时没有了解到每年要多算出0.0078天的问题,从公元前46年,到16世纪,一共累计多出了10天。为此,当时的教皇格雷果里十三世,将1582年10月5日人为规定为10月15日。并开始了新闰年规定。即规定公历年份是整百数的,必须是400的倍数才是闰年,不是400的倍数的就是平年。比如,1700年、1800年和1900年为平年,2000年为闰年。此后,平均每年长度为365.2425天,约4年出现1天的偏差。按照每四年一个闰年计算,平均每年就要多算出0.0078天,经过四百年就会多出大约3天来,因此,每四百年中要减少三个闰年。闰年的计算,归结起来就是通常说的:四年一闰;百年不闰,四百年再闰。
由于地球的自转速度逐渐降低,而公转速度则相对更加稳定,所以上述的系统经过更长的周期也会发生微小的误差。据计算,每8000年会有一天的误差,所以英国的天文学家John Herschel提议公元4000为平年,以后类推12000年,20000年亦为平年。但此提议从未被正式采纳。原因是到了4000年,地球自转的精确速度并非现在可以预测,所以届时参照真实数据方可做出判断。因此,在长远的将来,针对闰年的微小调整应该不是由预定的系统决定,而是随时不定性的。
3.2 中国农历中的闰年
中国旧历农历作为阴阳历的一种,每月的天数依照月亏而定,一年的时间以12个月为基准,平年比一回归年少约11天。为了合上地球围绕太阳运行周期即回归年,每隔2到4年,增加一个月,增加的这个月为闰月。闰月加到哪个月,以农历历法规则推断,主要依照与农历的二十四节气相符合来确定。在加有闰月的那一年有13个月,历年长度为384或385日,这一年也称为闰年。如1984年鼠年的农历中,有两个十月,通常成为前十月和后十月(即闰月)。农历闰年闰月的推算,3年一闰,5年二闰,19年七闰;农历基本上19年为一周期对应于公历同一时间。如公历的2001年5月27日、1982年5月27日和1963年5月27日这个日子,都是闰四月初五。
公历1982年至2042年与农历闰年闰月对照表:
1982年5月23日 闰四月小 壬戊年
1984年11月23日 闰十月小 甲子年
1987年7月26日 闰六月小 丁卯年
1990年6月23日 闰五月小 庚午年
1993年4月22日 闰三月小 癸酉年
1995年9月25日 闰八月小 乙亥年
1998年6月24日 闰五月小 戊寅年
2001年5月23日 闰四月小 辛巳年
2004年3月21日 闰二月小 甲申年
2006年8月24日 闰七月小 丙戊年
2009年6月23日 闰五月小 己丑年
2012年5月21日 闰四月小 壬辰年
2014年10月24日 闰九月小 甲午年
2017年7月23日 闰六月大 丁酉年
2020年5月23日 闰四月小 庚子年
2023年3月22日 闰二月小 癸卯年
2025年7月25日 闰六月小 己巳年
2028年6月23日 闰五月小 戊申年
2031年4月22日 闰三月小 辛亥年
2033年8月25日 闰七月小 癸丑年
2036年7月23日 闰六月大 丙辰年
2039年6月22日 闰五月小 己未年
2042年3月22日 闰二月小 壬戊年
4、用程序计算闰年用程序算出2000年到4000年之间的所有闰年(此时只考虑到3200年以前,故3200其实不是闰年):
int leapyear(int year) //判断某年是否闰年 闰年返回1,平年返回0
{
if ((year%400==0) || (year%100!=0) && (year%4==0))
return 1;
else
return 0;
}
void main()
{
int i=2000;
for(i;i<=4000;i++)
{
if(leapyear(i) == 1)
printf("%d,",i);
}
}
2000,2004,2008,2012,2016,2020,2024,2028,2032,2036,2040,2044,2048,2052,2056,2060,
2064,2068,2072,2076,2080,2084,2088,2092,2096,2104,2108,2112,2116,2120,2124,2128,
2132,2136,2140,2144,2148,2152,2156,2160,2164,2168,2172,2176,2180,2184,2188,2192,
2196,2204,2208,2212,2216,2220,2224,2228,2232,2236,2240,2244,2248,2252,2256,2260,
2264,2268,2272,2276,2280,2284,2288,2292,2296,2304,2308,2312,2316,2320,2324,2328,
2332,2336,2340,2344,2348,2352,2356,2360,2364,2368,2372,2376,2380,2384,2388,2392,
2396,2400,2404,2408,2412,2416,2420,2424,2428,2432,2436,2440,2444,2448,2452,2456,
2460,2464,2468,2472,2476,2480,2484,2488,2492,2496,2504,2508,2512,2516,2520,2524,
2528,2532,2536,2540,2544,2548,2552,2556,2560,2564,2568,2572,2576,2580,2584,2588,
2592,2596,2604,2608,2612,2616,2620,2624,2628,2632,2636,2640,2644,2648,2652,2656,
2660,2664,2668,2672,2676,2680,2684,2688,2692,2696,2704,2708,2712,2716,2720,2724,
2728,2732,2736,2740,2744,2748,2752,2756,2760,2764,2768,2772,2776,2780,2784,2788,
2792,2796,2800,2804,2808,2812,2816,2820,2824,2828,2832,2836,2840,2844,2848,2852,
2856,2860,2864,2868,2872,2876,2880,2884,2888,2892,2896,2904,2908,2912,2916,2920,
2924,2928,2932,2936,2940,2944,2948,2952,2956,2960,2964,2968,2972,2976,2980,2984,
2988,2992,2996,3004,3008,3012,3016,3020,3024,3028,3032,3036,3040,3044,3048,3052,
3056,3060,3064,3068,3072,3076,3080,3084,3088,3092,3096,3104,3108,3112,3116,3120,
3124,3128,3132,3136,3140,3144,3148,3152,3156,3160,3164,3168,3172,3176,3180,3184,
3188,3192,3196,3200,3204,3208,3212,3216,3220,3224,3228,3232,3236,3240,3244,3248,
3252,3256,3260,3264,3268,3272,3276,3280,3284,3288,3292,3296,3304,3308,3312,3316,
3320,3324,3328,3332,3336,3340,3344,3348,3352,3356,3360,3364,3368,3372,3376,3380,
3384,3388,3392,3396,3404,3408,3412,3416,3420,3424,3428,3432,3436,3440,3444,3448,
3452,3456,3460,3464,3468,3472,3476,3480,3484,3488,3492,3496,3504,3508,3512,3516,
3520,3524,3528,3532,3536,3540,3544,3548,3552,3556,3560,3564,3568,3572,3576,3580,
3584,3588,3592,3596,3600,3604,3608,3612,3616,3620,3624,3628,3632,3636,3640,3644,
3648,3652,3656,3660,3664,3668,3672,3676,3680,3684,3688,3692,3696,3704,3708,3712,
3716,3720,3724,3728,3732,3736,3740,3744,3748,3752,3756,3760,3764,3768,3772,3776,
3780,3784,3788,3792,3796,3804,3808,3812,3816,3820,3824,3828,3832,3836,3840,3844,
3848,3852,3856,3860,3864,3868,3872,3876,3880,3884,3888,3892,3896,3904,3908,3912,
3916,3920,3924,3928,3932,3936,3940,3944,3948,3952,3956,3960,3964,3968,3972,3976,
3980,3984,3988,3992,3996,4000,
使用非过程化语言来测算闰年
import java.util.*;
public class LeapYears {
public static void main (String[ ] args) {
Scanner input = new Scanner (System.in);
System.out.println ("输入年份: ");
int year = input.nextInt ();
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { //输出某年是闰年
System.out.println (year + "年是闰年");
} else { //输出某年是平年
System.out.println (year + "年是平年");
}
}
}
用TURBO PASCAL 来
var
year:integer;
begin
write('Enter year: ');readln(year);
if ((year MOD 4=0) AND (year MOD 100<>0)) OR (year MOD 400=0)
then writeln(year:6, 'is a leap year.')
else writeln(year:6,'is not a leap year')
end.