一:什么是閏年
關于公歷閏年是這樣規定的:地球繞太陽公轉一周叫做一回歸年,一回歸年長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 + "年是平年!"); } } }
如對本文有疑問,請提交到交流論壇,廣大熱心網友會為你解答??! 點擊進入論壇