记得几年前,有个新闻报道说,有我的记忆力很强,能够记住任意日期是星期几。
我感受不太靠谱,其实,这个星期几是能够经过公式计算出来的。
其中一种叫作基姆拉尔森计算公式:
公式是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
请按任意键继续. . .
(根据网络资料整理)