少了十一天???

 最近為了在程式中為使用者貼心的增加一個小功能:快速選擇日期。特別去找了一下月曆的計算方法,這才發現--年的計算居然有如此大的學問。而且在1752年9月的時候,9月2日直接就跳9月14日了,這中間整整少了十一天。哇!!!


  是我大驚小怪了嗎??


  請出Google大神來解答吧!
  資料來源:http://www.geocities.com/calshing/
  
大概整理了一下,有空的人再去看原文吧!!

原曆只有10個月、以三月為首、與365日相差了61日:

Martius, Aprilis, Maius, Junius, Quintilis, Sextilis, September, October, November, December

後修正達355日、並以January為首、February為最後一月:

January, Martius, Aprilis, Maius, Junius, Quintilis, Sextilis, September, October, November, December, February


再修正、將Feb調至Jan 及 Mar 中間、每隔一年在Feb後加一特別月Intercalaris或Mercedinus、一般有22或23日:

January, February, Martius, Aprilis, Maius, Junius, Quintilis, Sextilis, September, October, November, December

修訂將一年分為十二個月、規定單數月為31日、雙數月為30日、通常二月是29日(平年)、每四年設置一閏年、閏年的二月加多一日成為 30日:

因此平年有6*31+5*30+29=365日。
閏年有6*31+6*30=366。
四年?總共有365*3+366=1461日。
平均每年日數為1461/4=365.25,較準確回歸年365.2422相差0.0078日,即是每128年會有一日偏差。

羅馬議會將八月改成奧古斯都皇帝(Augustus Caesar)之名,稱為August。同時將八月改為大月而成31日,使它和紀念凱撒(Julius Caesar)的七月(July)日數相同,以顯示他和凱撒的功業同等偉大。而八月後的大小月全都反過來,即將九月和十一月改為30日,而十月和十二月則 改為31日,八月所增的一日由二月裡扣減,因此平年二月變成28日,閏年二月變成29日。每年平均日數不變即365.25日:

January, February, Martius, Aprilis, Maius, July, August, Sextilis, September, October, November, December

根據天文學家Aloysius Lilius及Christopher Clavius建議,從現有曆法中減去十天使春分出現在3月21日,因為他們觀察到春分點發生在3月11日:


1.將1582年10月5日至1582年10月14日這10日取消。
2.每個可被 4 整除的年份是一個閏年。
3.但00結尾的年份一定要被 400 整除,才能算是閏年。否則不是閏年。因此,1700,1800,1900,2100 和 2200 年都不是閏年。而1600,2000,和 2400年是閏年。

由以上可知,格勒哥里曆以400年為一循環。400年共有365 * 400 + 97 = 146097日,平均每年有146097 / 400 = 365.2425日。與準確回歸年365.2422相比只差0.0003日。因此3千3百多年才會產生一日的偏差。

英國及其殖民地(包括現在的美國)在1752年執行。所以1752年9月2日後面跟著1752年9月14日。

所以年的計算法程式碼如下:

/*以下為計算該年該月有幾天之副程式:因為1752年之前為四年一閏, 1752年以後位四年一閏,逢百不閏,而四百又要閏,故分為以下狀況。*/

int count_days(int year,int month){
int days;
if(year<=1752 &&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp; year%4==0 && month==2) days=29; else if(year>1752 &&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;
((year%4==0 &&amp;amp; year%100!=0)||year%400==0) && month==2)
days=29;
else if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
days = 31;
else if(month==4||month==6||month==9||month==11)
days = 30;
else
days = 28;
return(days);


/* 此為特例之副程式,由於1752年9月無3∼13日,故寫一專門處理該年月之副程式。 */

int counter,days,first_day,end_day;
first_day=2;
end_day=30;
String s="Sun\tMon\tTue\tWed\tThu\tFri\tSar\n";
for(counter=0;counter"\t";
for(days=1;days<=end_day;++days){ s+=Integer.toString(days)+"\t"; if((first_day+days)%7==4&&days!=2) s+="\n"; if(days==2) days=13; }




後來我去看了一下其他人寫的應用程式或是市面上流通的系統,大家好像都直接忽略了這個日期,會不會只是我自己想太多了啊???Orz........................................

留言

這個網誌中的熱門文章

<備忘>都是電池惹的禍......!?

それぞれに

Google推出自有Web Browser--Chrome