Chinaunix首页 | 论坛 | 博客
  • 博客访问: 990076
  • 博文数量: 102
  • 博客积分: 10120
  • 博客等级: 上将
  • 技术积分: 2754
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-13 23:00
文章分类

全部博文(102)

文章存档

2011年(6)

2010年(55)

2009年(16)

2008年(25)

分类:

2009-09-21 19:06:03

起因

在我看过的各种各样的编程书籍中,尤其是入门性的编程书籍中,几乎都会提到关于闰年的计算,有时是在讲条件判断语法的时候,有时是在讲时间和日期的 处理的时候。虽然我对此已经非常熟悉了,但从未认真思考过为什么要这样计算闰年。最近在读K&R C的时候,突然就想把这个问题弄清楚,于是在google和wiki上搜索了一番,在把这个问题基本上搞清楚了以后,我发现这个问题其实在某种程度上还蛮 有趣的。

闰年与历法

所谓闰年是指比平常年份多上一天或者多天的年份。不是闰年的年份称为平年。之所以要引入闰年,是为了保证人类的历法和天文上的太阳年保持一致。所谓太阳年,是指地球绕太阳公转一圈所花的时间。

那么,人类为什么需要历法呢?因为人类中只有很少一部分人是天文学家,只有天文学家才知道精确的宇宙时间。但是人类又离不开时间,人们需要根据时间 来决定什么时候该播种,什么时候该收获,什么时候天气会变冷,什么时候候鸟会迁徙。人们不能总是等察觉到季节发生更替的时候才开始着手进行生产或者生活上 的准备,人们需要能够提前知道什么时候该做什么事,于是天文学家们为人们制定了历法。历法主要是为了向人们提供这样一种信息:季节会在哪个时间点上交替, 气候会有什么样的变化,什么时候应该种植什么样的农作物,等等。显然,历法只是为普通人准备的,对于天文学家而言,历法可没什么好说的。

地球上的季节交替是地球绕太阳公转的结果,地球绕太阳公转一圈也就完成了一次四季轮回。和我们的感觉一样,地球绕太阳公转一圈的时间大约是一年,但 可惜的是,这个周期并不是精确的刚好一年,而是比一年略多一点点。我们都知道,地球自转一圈的时间是一天,若以这个时间为基准进行测量的话,地球绕太阳公 转一圈的时间大约是365.242374天(这个时间是在动态变化的)。这引出了一个什么问题呢?假如我们武断地规定一年固定地等于365天的话,那么每 过一年,我们的时间和天文上的时间就有了0.242374天的误差。那么,如此这般地过上400年,人类的时间和实际的时间就有了 0.242374×400=96.9496天的误差,比三个月还多!倘若人们使用这样的历法的话,人们就会惊奇地发现,从历法来看,当前应该已经进入了夏 季,可实际上呢,冬雪才刚刚化完,小草才刚刚发芽。

显然,这样的历法是行不通的。人们需要的是一部大致上固定,和实际的天文时间没有太大误差的历法。同时,这样的历法还不能太复杂,要容易使用,不能让全体人民拿着计算器跟什么太阳年啊、地球日啊、公转啊、自转啊这些天文学家的玩意儿一起死磕啊。于是,闰年就应运而生了。

在历法中引入闰年的目的,实际上就是要补偿因为地球人用365天表示一年所引入的误差。除了当前在世界范围内广泛使用的Gregorian历法(通 常称为格里历),人类历史上曾经出现甚至现在还在使用的历法,几乎都有闰年的概念,这些历法包括(但不限于):Julian历、Coptic历、 Ethiopian历、修订版Julian历、中国传统历法(也叫农历或者阴历)、Hebrew历、Hindu历、Iranian历等。每种历法采用的闰 年方案都不一样,有的增加一天(比如Gregorian历和Julian历),有的则增加一个月(比如中国传统历法和Hebrew历)。不同闰年方案的计 算方式有很大不同,比如Gregorian历的计算方法就很简单,而中国传统历法的计算就非常复杂,中国古代天文台官员负责的一项工作就是计算历法,然后 由皇帝下诏在全国颁布施行。

如何判断闰年

给定一个年份,如何判断这一年是平年还是闰年呢?这里仅以Gregorian历--也就是我们最常用的历法--的计算方法为例进行说明。在Gregorian历中,符合下列条件之一的年份是闰年,否则就是平年:


  • 年份能够被400整除
  • 年份能够被4整除,但不能被100整除


这两个条件就是Gregorian历判断是否闰年的全部规则。由于这两条规则异常简单,所以,有了Gregorian历之后,普通人也能在没有天文 学家帮助的情况下计算历法了,这实在是一大进步。根据Gregorian历,很容易知道,1900年不是闰年,但2000却是货真价实的闰年,2004、 2008、2012年也都是闰年,而2001年则无论如何也不是闰年。

在Gregorian历中,如果某一年是闰年,那么这一年的总天数将是366天,而不是平年时的365天。增加的这一天被加到2月上作为2月的最后 一天。在平年时,2月总共有28天,但是,在闰年的年份,2月的总天数是29天。那些在闰年的2月29日出生的人们活得非常的悲惨,因为他们一生通常只能 活到25岁,并且通常只能吃到最多25个生日蛋糕 :-) 

为什么这样计算闰年

Gregorian历使用这样的规则计算闰年是有原因的。为了说明Gregorian历为什么要这样做,我们不妨以400年为一个周期来考察在这段 时间内Gregorian历将和实际天文时间产生多大误差。按照Gregorian历的计算规则,在公元开始后最初的400年里,下面这些年份将是闰 年:4,8,12,16,20,...,92,96,104,108,112,...,192,196,204,208,212,...,292,296,304,308,312,...,392,396,400。 总共有97次闰年,400-97=303次平年,因此400年内按照Gregorian历总共可有的天数 是:97×366+303×365=146097(天)。而实际的天数是:365.242374×400=146096.9496(天)。两者之间的误差 是:146097-146096.9496=0.0504(天)。在此后的每个400年的周期里面,上面的情形将不断重复。照此下去,大约要经过20个 400年之后(也就是8000年之后),Gregorian历和实际的天文时间之间才会有0.0504×20=1.008(天)的误差。考虑到地球绕太阳 一圈的时间是在365.242374(天)附近波动的,因此Gregorian历实际上已经相当精确了。精确、简单,这两个最重要的特点使得 Gregorian历在世界范围内得以广泛使用。

阅读(1028) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~