記得幾年前,有個新聞報道說,有我的記憶力很強,能夠記住任意日期是星期幾。
我感受不太靠譜,其實,這個星期幾是能夠經過公式計算出來的。
其中一種叫作基姆拉爾森計算公式:
公式是W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日數+1,m表示月份數,y表示年數。
注意:在公式中有個與其餘公式不一樣的地方:
把一月和二月當作是上一年的十三月和十四月,例:若是是2004-1-10則換算成:2003-13-10來代入公式計算。
還有蔡勒公式:
W = [C/4] - 2C + y + [y/4] + [13 * (M+1) / 5] + d - 1
或者是:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
公式中的符號含義以下:
w:星期; w對7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六
c:世紀-1(前兩位數)
y:年(後兩位數)
m:月(m大於等於3,小於等於14,即在蔡勒公式中,某年的一、2月要看做上一年的1三、14月來計算,好比2003年1月1日要看做2002年的13月1日來計算)
d:日
[ ]表明取整,即只要整數部分。
另外,還有個事情,這個公式只能計算1582年10月15日(含)以後的情形。
緣由是什麼呢?
在如今通行的歷法記載上,全世界竟然有十天沒有任何人出生過,也沒有任何人死亡過,也沒有發生過大大小小值得記念的人或事。這就是1582年10月5日至10月14日,持續時間爲0。
事實上,目前世界通行的公曆中,就有持續時間爲0的10天,即公元1582年10月5日至14日。事情是這樣的:
西方曆法的第一次改革是羅馬朱利烏斯·凱撒大帝於公元前45年親自引進的。當時採用的數字是一年365.25天,因而朱利安曆法成爲最簡單的歷法:第1、2、三年都是365天,三年餘下的0.25天給第四年,第四年就有366天,這就是閏年。因而重複365,365,365,366的週期,每一年都是整數。
可是,一個太陽年不恰好是362.25天,而是 362.242199…天,每一年相差11分14秒,也就是朱利安曆法中每一年多算了11分鐘14秒。因爲偏差不太大,頭幾年沒什麼關係,凱撒活着時影響還不大。可是,一年又一年,偏差累積起來,朱利安曆法就與實際的太陽年不合拍了。例如每一年春分在3月21日先後,但幾個世紀後,春分在朱利安曆法上的日期愈來愈提早了,這對農民種地不方便,對教會肯定復活節在哪一天也帶來麻煩。因爲朱利安曆法是凱撒親自制定的,上述狀況對他的威信是一個沉重打擊。
16世紀時,教皇格利戈裏八世進行了一次校訂。由於到16世紀,每一年11分14秒已經累積成10天,也就是曆法上多了10天,這對於肯定復活節形成嚴重困難,不得不採起措施補救。爲此,格利戈裏採起了解決此類難題的最古老最有效的策略----他召集一個委員會,任命一位聰明的主席,即傑出的耶穌會數學家克利斯多弗·克拉維斯(Christopher Clavius),要求委員會提出解決方案。委員會於1587年開始工做。
克拉維斯委員會面臨兩個不一樣的問題,它用不一樣的方法進行解決。第一,朱利安曆法如今走快了10天,必須拉回到與太陽年一致。克拉維斯建議用官方聲明把這10天抹掉!教皇格利戈八世於1582年2月24日以教皇訓令頒佈,將1582年10月5日至14抹掉,因而這10天就消失了,一去不復返。1582年10月4日過完了,次日已是10月15日了,因而曆法又回到與太陽年同步。
當時以及後來有許多人對此感到驚愕,目瞪口呆,有人認爲是荒唐、武斷。「教皇一紙訓令就能抹掉日曆上的10天?」
可是,這10天的確不存在了,這10天什麼也沒有發生,這10天根本就沒過日子。若是你能找到當時的日記,10月4日記完後,下一頁就是10月15日的事。用科學語言表達,這10天的持續時間爲0。
其實徹底沒必要驚訝。太陽年、太陽日與天然現象有聯繫,至於某一天是什麼日子,則是人爲的,與給小孩起名字同樣。咱們能夠不用公曆,一年不分月,只叫第1天,第2天,……第125天,……到第365天,這是容許的。喜歡偶數的人能夠發明一個「偶很多天曆」:2月2日,2月4日……4月2日……12月30日,12月32日……,14月2日,這也是容許的,只要一年365天或者366天就行。這再一次證實,在一個科學理論或體系中區分出由天然現象決定(於是必須符合實驗)的部分和人爲規定的部分是重要的。
固然,這個決定對當時的社會生活也會有必定影響,例如出生在10月5日至10月14日的人在1582年找不到本身的生日,但與出生在2月29日的人相比,少過一年生日算不了什麼。還有,那年10月份的工資、利息也會有問題,但不知那時的銀行、工資制度什麼樣。不過這些問題的影響微乎其微。
第二個問題是須要提出曆法的補充規則,不讓每一年多出的11分14秒累積得太多。因而克拉維斯委員會提出一年有365.2422天的方案,這比朱利安曆法的365.25天大大接近天體運動實際。據此對朱利安曆法只有「四年一閏」的簡單規定進行校訂:四年一閏,可是世紀之交的’00年,如100年,200年,不閏,即每一百年少閏一次。這樣一算,閏年又太少了,因而進一步規定:每四個世紀的世紀之交,即400年,800年等還是閏年。最終關於閏年的規定爲,用4除盡的年份還是閏年。教皇訓令也批准了這個校訂。通過這兩個校訂的朱利安曆法叫格利戈裏曆法,也就是咱們如今用的公曆。因爲格利戈裏曆法中的年與太陽年仍有偏差,還須要進一步校訂,不過兩者只相差25.96秒,每過2800年才相關一天,在實際生活中沒什麼影響。這樣,1900年不是閏年,但2000年是閏年,每400年才遇到一次!又一個特殊性!
格利戈裏曆法很快在羅馬天主教勢力範圍被廣泛接受,可是在英國卻引發了一片喧囂的反對聲,英國人仍然堅持朱利安曆法,拒絕「抹掉10天」。直到1752年,英國人才想通,理性終於佔了上風,不過從1582年到那時,曆法又多出了1天,因此英國議會在1752年做出決定,抹掉11天----1752年9月3日至13日,至此才接受了格利戈裏的改革。請注意,英國曆史中,這11天什麼也沒有發生。由此能夠看到,一次曆法改革是多麼不容易,對於一個聰明、合理的決定,僅僅由於看上去有點怪就有人反對,居然花了快二百年才接受!
附錄一個基姆拉爾森計算公式C語言程序
#include "stdio.h"
void CaculateWeekDay(int y,int m, int d)
{
if(m==1||m==2) {
m+=12;
y--;
}
int iWeek=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
switch(iWeek)
{
case 0: printf("星期一\n"); break;
case 1: printf("星期二\n"); break;
case 2: printf("星期三\n"); break;
case 3: printf("星期四\n"); break;
case 4: printf("星期五\n"); break;
case 5: printf("星期六\n"); break;
case 6: printf("星期日\n"); break;
}
}
void main()
{
int year=0,month=0,day=0;
printf("請輸入日期:\n格式爲:1900,1,1\n");
char temp = '1';
while (temp != '0')
{
scanf("%d,%d,%d",&year,&month,&day);
scanf("%c",&temp);
CaculateWeekDay(year,month,day);
printf("輸入0退出,其餘繼續:");
scanf("%c",&temp);
}
}
運行效果:
請輸入日期:
格式爲:1900,1,1
2008,4,29
星期二
輸入0退出,其餘繼續:d
2008,1,1
星期二
輸入0退出,其餘繼續:l
2008,8,8
星期五
輸入0退出,其餘繼續:0
請按任意鍵繼續. . .
(根據網絡資料整理)