如果你使用Linux/Unix,那么很大可能你在哪里看到过类似于《Linux下XX有趣命令》这样的文章,其中有一个是这样的:

cal 9 1752

运行的结果如下图所示:

calendar

配合文章标题中的“有趣的命令”,我一直认为这是cal程序的一个BUG,直到今天在看《程序员修炼之道》第4章“注重实效的偏执-断言式编程”一节时,在练习中有一道题目如下:

19.一次快速的真实性检查。下面这些“不可能”的事情中,哪些可能发生?
	1. 一个月小于28天
	2. stat("," ,&sb) == -1 (也就是,无法访问当前目录)
	3. 在C++里:a = 2;b = 3;if(a + b != 5) exit(1)
	4. 内角和不等于180度的三角形
	5. 没有60秒的一分钟
	6. 在Java中:(a + 1) <= a

我在心里做了回答后,翻到后面看答案,结果惊奇的发现确实有存在一个月小于28天的:

1. 1752年9月只有19天。这是作为“格利高利改革”的一部分,为使日历同步而进行的

那么为什么要进行日历同步呢?难道“格利高利”在PC上为google日历添加了内容,然后需要同步到手机吗?呵呵呵呵,怎么可能!

原来地球上的历法是有很多的,比如在中国,现在在用的就有公历(俗称阳历)和农历(俗称阴历),而且公历和农历的日期是存在差别的,比如今天公历是2013年8月18日,但是农历是7月12日,相差了1个多月。

那么在其他国家,也是有各种各样的历法,但是大家又注意到,现在的东西方国家使用的公历是一样的,所以这其中就产生了日历同步这一说。我们来看一下维基百科上“公历”词条的解释:

现行公历即格里历,又译国瑞历、额我略历、格列高利历、格里高利历,是由意大利医生兼哲学家阿洛伊修斯·里利乌斯改革儒略历制定的历法,由教皇格列高利十三世在1582年颁行。公历是阳历的一种,于1912年开始在中国正式采用,取代传统使用的中国历法农历,而中国传统历法是一种阴阳历,因而公历在中文中又称阳历、西历、新历。格里历与儒略历一样,格里历也是每四年在2月底置一闰日,但格里历特别规定,除非能被400整除,所有的世纪年(能被100整除)都不设闰日;如此,每四百年,格里历仅有97个闰年,比儒略历减少3个闰年。格里历的历年平均长度为365.2425日,接近平均回归年的365.242199074日,即约每3300年误差一日,也更接近春分点回归年的365.24237日,即约每8000年误差一日;而儒略历的历年为365.25日,约每128年就误差一日。到1582年时,儒略历的春分日(3月21日)与地球公转到春分点的实际时间已相差10天。因此,格里历开始实行时,将儒略历1582年10月4日星期四的次日,为格里历1582年10月15日星期五,即有10天被删除,但原星期的周期保持不变。格里历的纪年沿用儒略历,自传统的耶稣诞生年开始,称为“公元”,亦称“西元”。

从上面可以知道,其实第一个不足28天的月份产生在1582年的10月,即从儒略历同步到格里历时,为了与地球公转情况对上号,中间的10天已经被删除了。

那么1752年进行的“格利高利改革”的一部分之日历同步又是干嘛的?

上面我们说到,历法是有各种各样的,1582年由当时的教皇颁布的格里历,只有意大利、波兰、西班牙、葡萄牙在用,其他的新教国家是予以抵制的。但是毕竟格里历算法比较优秀,后面陆陆续续的,各个国家都开始同步到格里历。这当中就包括1752年的大英帝国(包括英格兰、苏格兰、以及现在美国的一部份),而由于在1582年到1752之间,新旧历法的时间差已经扩大到了11天,所以儒略历 1752年 9月2日星期三的次日是格里历1752年9月14日星期四,日期跳过11日。其实这11日还有一段小故事,再看维基百科:

值得注意的是,1582年,罗马教廷减去的是10天,而到1752年修改历法的时候却减去了11天的原因其实很简单,这涉及到了闰年的问题,闰年的计算方法:公元纪年的年数可以被四整除,即为闰年;被100整除而不能被400整除为平年;被100整除也可被400整除的为闰年。而1600年和1700年的2月都是29天,原来在1800年之前的闰年计算方法中没有把被100整除而不能被400整除的年份算为平年,更没有考虑到被100整除也可被400整除的算为闰年。所以罗马教廷把1700年的2月算成29天,而1600年的2月却是阴差阳错地恰好与现行的历法相符。结果1582年到1752年之间,当时历法算法和现行历法算法实际只相差了1天。

我在Linux上查看了一下1582年10月的日历,结果如下:

calendar-2

从中大概也可以猜到cal程序的作者采用的是大英帝国的同步时间,毕竟是曾经的王者“日不落”帝国嘛!

下面在简单看看其他国家关于同步到格里历的一些信息:

在阿拉斯加,儒略历1867年10月6日星期五的次日是格里历10月18日星期五。之所以连续二日星期五是因为“阿拉斯加时刻”从“亚洲时刻”改成“北美时刻”,使得国际换日线从阿拉斯加之东移往之西。此事是因为美国从沙俄买入阿拉斯加,并发生在创造时区之前。

瑞典在1699年有计划从儒略历改成格里历,但预定的办法是取消自1700年至1740年原有的11闰日,即2月29日,以期求渐进在最后将日期与格里历接轨。在此四十年间,瑞典历与儒略历以及格里历日期将完全不同。此制度明显足以使得此期间的瑞典事件发生在何日记录不易的困扰。更糟糕的是,此制度施行不佳,而1704年及1708年应已排除的闰日仍被使用。此时瑞典历日期应比格里历慢8日,但事实上是慢10日。卡尔十二世国王承认渐进改历没有见效而抛弃之,但不是直接改用格里历,而是决定改回儒略历,方法是1712年2月29日的次日加上2月30日,日期再度比格里历慢11日。瑞典最后在1753年采用格里历,就是当年儒略历 2月17日星期三的次日是格里历3月1日星期四。

俄罗斯在1917年发生的十月革命(开始于儒略历10月25日,合格里历11月7日)后,以1918年1月24日的命令接受格里历,也就是儒略历1918年1月31日 星期三的次日是格里历1918年2月14日星期四。

中国在1912年1月1日,中华民国成立时,以公历取代传统的农历,定格里历为国历,但年份不使用公元纪年,另设民国纪年,以中华民国成立的1912年为首年,即中华民国元年等于1912年、中华民国二年等于1913年等(公元纪年减1911,即等如民国纪年),“中华民国X年”一般简称为“民国X年”、“民X”。但中国不久后进入不同军阀使用不同历法的军阀割据时期。1928年10月国民党北伐统一中国,中华民国政府命令自1929年1月1日起使用公历。1949年10月1日,中华人民共和国成立,取代中华民国统治中国大陆,继续使用公历,但年份改以公元纪年。而中华民国退守台湾后,仍在其有效统治的台湾地区使用民国纪年,台湾民间亦常使用民国纪年,一直至今。

台湾于1895年(明治28年)成为日本殖民地,官方采用公历。1919年改行公历新年,但实际上日本人使用公历,台湾人仍习惯使用农历。直到皇民化运动期间的1940年2月8日,台湾总督府公告废止农历新年,订农历新年起连续五日为“劳动服务周”。至1945年,台湾主权移交中华民国,继续使用公历,但年份改用民国纪年。1955年,中华民国政府机关恢复农历新年休假。

日本在1873年(明治6年)1月1日,以公历取代传统天保历,但年份不使用公元纪年,而使用日本天皇年号纪年:明治元年等于1868年,大正元年等于1912年,昭和元年等于1926年,平成元年等于1989年,一直至今。民间常使用公元(西暦)纪年,但政府较少使用之。

朝鲜受到日本影响,在1896年1月1日采用公历。

最后采用格里历的国家是土耳其,在1926年。

伊斯兰教国家仍然使用伊斯兰历;佛教国家采纳佛教历,纪元使用佛教纪元,即公元2000年为佛教纪元佛祖诞辰2544年。


blog comments powered by Disqus

Published

18 August 2013

Category

something