一:什么是闰年
关于公历闰年是这样规定的:地球绕太阳公转一周叫做一回归年,一回归年长365日5时48分46秒。
因此,公历规定有平年和闰年,平年一年有365日,比回归年短0.242199日,一般用四位小数计算,及0.2422,四年共短0.9688日,故每四年增加一日,并且把这多出了的一天放到二月份,所以闰年的二月份有29天,这一天也叫闰日,这一年共有366日,就是闰年。但四年增加一日比四个回归年又多0.0312日,400年后将多3.12日,故在400年中少设3个闰年,也就是在400年中只设97个闰年,这样公历年的平均长度与回归年就相近似了。由此规定:年份是整百数的必须是400的倍数才是闰年,例如1900年、2100年就不是闰年。
也就我们居住的地球总是绕着太阳旋转的。地球绕太阳转一圈需要365天5时48分46秒,也就是365.2422天。为了方便,一年定为365天,叫做平年;这样每过四年差不多就要多出一天来,把这一天加在2月里,这一年就有366天,叫做闰年。
通常,每四年里有三个平年一个闰年。公历年份是4的倍数的,一般都是闰年。
按照每四年一个闰年计算,平均每年就要多算出0.0078天,这样经过四百年就会多算出大约3天来,因此,每四百年中要减少三个闰年。所以规定,公历年份是整百数的,必须是400的倍数的才是闰年,不是400的倍数的就是平年。
也就是我们通常所说的:
四年一闰,百年不闰,四百年再闰。
二:数学中计算闰年的方法
一般的在数学运算中,或者在公历纪年法中,能被4整除的大多是闰年,除了那些能被100整除而不能被400整除的年份以外。
①非世纪年能被4整除,且不能被100整除的是闰年。(如2004年是闰年,1901年不是闰年)
②世纪年能被400整除的是闰年。(如2000年少闰年,1900年不是闰年)
三:闰年的差值计算
现时的公历以回归年为“年”的计算基础,而一个回归年大约等于365.24220日。因为在平年公历只计算365日,结果四年后便会累积0.24220×4=0.9688日,大约等于一日,所以便逢四年增加一日闰日以抵销这0.9688日。但是还是稍微的少了点,这样一时没有多少时间,可是到了一个百年时就会相差了大约0.78天,即多加了。所以要再次规定细节,到100年是不在加,这样又会每100年的时间少了0.22天,到了400年时,差了大约0.9天了,所以那个百年是要再加上润日才可以基本对应的。但是这样仍然会有些许的误差,但是已经相当的小了。我只是大致进行了计算,实际的是相差很小很小的,微乎其微的,但是日积月累却可以百年出“日”的不起眼的小数上。下面就让每我们一起来计算一下这个差值:
使用实际时间计算:
一个回归年大约是:365日5时48分46秒,我们把不足一天的时间转换成秒数:5×3600+48×60+46=20926秒
而一天的秒数是:24×3600=86400秒
我们通常计算的是以400年为一个循环,也就是前面所说的:四年一闰,百年不闰,四百年再闰。
那么400年的时间总共天数和多出的秒数:天数:365×400=146000天,多余秒数:20926×400=8370400秒,
把多出来的秒数转换成天时分秒的形式:96天21小时6分40秒
然后把这个秒数转换成天的小数:8370400/3600/24=96.87962963
数学计算中常用的数值:
我们通常在数值计算中用到一个回归年是365.2422天
那么400年的时间是多少呢?应该是365.2422×400,我们把这个计算式分解下,365×400+0.2422*400,其中365×400和前面的一样,我们这里就不再次计算,我们只算0.2422*400=96.88天
这个96.88天数减去实际天数96.87962963:96.88-96.87962963=0.00037037天
而0.00037037天转换成秒:0.00037037×24×3600=31.999968秒,大约是32秒
验证是否相差32秒:
把96.88天的0.88天转换成秒数:0.88×86400=76032
把76032秒转换成天时分秒的形式:96天21小时7分12秒
结论:
通过以上数据的计算,我们可以看出每年以365.2422天计算400年为周期,和实际直接的差值是32秒,也就是400年有32秒的误差。
但是我们实际计算400年都是按97个润计算,也就是97天 - 96天21小时6分40秒=2小时53分20秒的误差。
可能有人会问了,时间长了也是有误差的啊?你说的对,咱们来计算一下误差一天要经过多少年:每天的秒数是86400,除以32,然后再乘以400:86400/32*400=108000年,也就是要经过100多万年会多出1天的误差,在时间的长河中,人的有生之年相对于108万年有这样的误差存在已经是微乎其微了,可以忽略不计了。就算以2小时53分20秒的误差计算:400*86400/(2*3600+53*60+20)=3323.077年,也需要经过3000多年的时间会多出一天的时间误差。
具体使用那个数值?需要精确度到多少?,使用哪一个数值取决于你自己了,我这里只是告诉你各个数值之间的误差。
声明:当然我这里的计算也是有误差的,我这里只精确到秒。
闰年计算
1.能被4整除而不能被100整除.(如2004年就是闰年,1900年不是)
2.能被400整除.(如2000年是闰年)
算法
public boolean isLeapYear(long year) { return ((year & 3) == 0) && ((year % 100) != 0 || (year % 400) == 0); }
解析
表达式(a&3)==(a%4)的值是1
因为无论a的值为多少a&3的结果只保留a的最后2位
如a的值为17,它变为二进制为10001,而3为00011,它们相与的结果只有a的1和2位数字保留下来也就是01,因为与1相与就保留原数据,与0相与就变0 如 a&1=a a&0=0
而a%4也是保留a的最后2位,因为只有最后2位的值为3,小于4,其它都>4
---------------------
package cn.huhui.demoTest; import java.util.Calendar; public class Test1 { public static void main(String[] args) { // TODO Auto-generated method stub /* * 高级算法:调用Calendar类的方法 判断3月1日 * 向前偏移一天 */ Calendar c =Calendar.getInstance(); c.set(1900, 2, 1); c.add(Calendar.DAY_OF_MONTH, -1); int day=c.get(Calendar.DAY_OF_MONTH); System.out.println(day); } }
闰年的判定规则是:
如果该年能被4整除且不能被100整除,或者能被400整除,则该年是闰年,否则不是
import java.util.Scanner; public class LeapYear { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("请输入一个年份:"); long year = scan.nextLong(); if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { System.out.println(year + "年是闰年!"); } else { System.out.println(year + "年是平年!"); } } }
如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛