儒略历日算法
(2016-09-26 17:47:44)
标签:
教育文化娱乐历法天文 |
分类: 天 文 历 法 |
儒略日数是指从公元 -4712 年开始连续计算日数得出的天数及不满一日的小数,通常记为 JD (**)。传统上儒略日的计数是从格林尼治平午,即世界时12点开始的。若以力学时(或历书时)为标尺,这种计数通常表达为“儒略历书日”,即JDE (**),其中E只是一种表征,即按每天86400个标准秒长严格地计日。例如:
1977年4月26.4日 UT = JD 2443 259.9
1977年4月26.4日 TD = JDE 2443 259.9
儒略日的计算
设Y为给定年份,M为月份,D为该月日期(可以带小数)。
若M > 2,Y和M不变,若 M =1或2,以Y–1代Y,以M+12代M,换句话说,如果日期在1月或2月,则被看作是在前一年的13月或14月。
对格里高利历有 :A = INT(Y/100) B = 2 - A + INT(A/4)
对儒略历,取 B = 0
要求的儒略日即为:JD = INT(365.25(Y+4716))+INT(30.6001(M+1))+D+B-1524.5
使用数值30.6取代30.6001才是正确的,但我们仍使用30.6001,以确保总能取得恰当的整数。事实上可用30.601甚至30.61来取代30.6001。例如,5乘30.6精确等于153,然而大多数计算机不能精确表示出30.6,这导致得出一个152.999 9998的结果,它的整数部分为152,如此算出的JD就不正确了。
http://blog.csdn.net/orbit/article/details/7825004
上述计算星期的方法虽然步骤简单,但是每次都要计算两个日期的时间差,不是非常方便。如果能够有一个公式可以直接根据日期计算出对应的星期岂不是更好?幸运的是,这样的公式是存在的。此类公式的推导原理仍然是通过两个日期的时间差来计算星期,只是通过选择一个特殊的日期来简化公式的推导。这个所谓的特殊日期指的是某一年的12月31日这天刚好是星期日这种情况。选择这样的日子有两个好处,一个是计算上可以省去计算标准日期这一年的剩余天数,另一个是计算出来的日期差余数是几就是星期几,不需要再计算星期的差值。人们知道公元元年的1月1日是星期一,那么公元前1年的12月31日就是星期日,用这一天作为标准日期,就可以只计算整数年的时间和日期所在的年积累的天数,这个星期公式就是:
w = (L * 366 + N *
365 + D) %
7
公式中的L是从公元元年到y年m月d日所在的年之间的闰年次数,N是平常年次数,D是y年内的积累天数。将整年数y - 1 = L + N带入上式,可得:
w = ( (y - 1) * 365 +
L + D) %
7
根据闰年规律,从公元元年到y年之间的闰年次数是可以计算出来的,即:
http://my.csdn.net/uploads/201208/02/1343919135_4487.gif
将L带入公式2,得到星期w的最终计算公式:
http://my.csdn.net/uploads/201208/02/1343919189_4239.gif
还以2005年5月31日为例,利用公式5计算w的值为:
http://my.csdn.net/uploads/201208/02/1343919223_4309.gif
得到2005年5月31日是星期二,和前面的计算方法得到的结果一致。根据上述分析,可得写出使用公式5计算星期的算法实现:
146 147 148 149 150 151 152 153 |
对计算出的w值除以7,得到的余数就是星期几,如果余数是0,则为星期日。蔡勒公式中各符号的含义如下:
w
c
m
y
d
为了方便口算,人们通常将公式6中的http://my.csdn.net/uploads/201208/02/1343919519_2640.gif
。目前人们普遍认为蔡勒公式是计算某一天是星期几的最好的公式。但是蔡勒公式有时候可能计算出的结果是负数,需要对结果+7进行修正。比如2006年7月1日,用蔡勒公式计算出的结果是
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
http://my.csdn.net/uploads/201208/02/1343919635_3154.gif
公式7适用于对1582年10月4日之前的日期计算星期,1582年10月5日与1582年10月15日之间的日期是不存在的,因为它们都是同一天。
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 |
GetDaysOfMonth()函数其实就是从daysOfMonth表中查一下每月的天数,如果是闰年,则对二月的天数修正(+1),daysOfMonth表定义如下:
int daysOfMonth[MONTHES_FOR_YEAR] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
计算星期不必对每一天都计算一次,只要对每个月的第一天计算一次就可以了,以后的日期可以用
********************************************************************************
********************************************************************************
----------January----------
Sunday
1
8
15
22
29
----------February----------
Sunday
5
12
19
26
----------March----------
Sunday
4
11
18
25
……
小知识2:儒略历和格里历
在公元1582年10月15日之前,人们使用的历法是源自古罗马的儒略历,儒略历的置闰规则就是四年一闰,但是没有计算每年多出来的0.0078天,这样从公元前46年到公元1582年一共累积多出了10天,为此,当时的教皇格里十三世将1582年10月5日人为指定为10月15日,并开始启用新的置闰规则,这就是后来沿用至今的格里历。
小知识3:约化儒略日
由于儒略日数字位数太多,国际天文联合会于1973年8月决定对其修正,采用约化儒略日(MJD)进行天文计算,定义MJD
= JD – 2400000.5,MJD相应的起始点是1858年11月17日
小知识4:1752年9月到底是怎么回事儿
如果你用的操作系统是unix或linux,在控制台输入以下命令:
#cal 9 1752
你会看到这样一个奇怪的月历输出:
September 1752
Su Mo Tu We Th Fr Sa
17 18 19 20 21 22 23
24 25 26 27 28 29 30
1752年的9月缺了11天,到底怎么回事儿?这其实还是因为从儒略历到格里历的转换造成的。1582年10月5日,罗马教皇格里十三世宣布启用更为精确的格里历,但是整个欧洲大陆并不是所有国家都立即采用格里历,比如大英帝国就是直到1752年9月议会才批准采用格里历,所以大英帝国及其所有殖民地的历法一直到1752年9月才发生跳变,“跟上”了格里历。德国和荷兰到了1698年才采用格里历,而俄罗斯则直到1918年革命才采用格里历。Linux的cal指令起源与最初AT&T的UNIX,当然采用的是美国历法,但是美国历史太短,再往前就只能采用英国历法,所以cal指令的结果就成了这样。对于采用格里历的国家来说,只要知道1582年10月发生了日期跳变就行了,可以不用关心1752年9月到底是怎么回事儿。但是对于研究历史和考古的人来说,就必需要了解这个历史,搞清楚每个欧洲国家改用格里历的年份,否则就可能在一些问题上出错。在欧洲研究历史,你会发现很多事件都是有多个时间版本的,比如大科学家牛顿的生日就有两个时间版本,一个是按照儒略历历法的1642年12月25日,另一个是格里历历法的1643年1月4日,对于英国人来说,1752年之前都是按照儒略历计算的,所以英国的史书可能会记载牛顿出生在圣诞节,这也没什么可奇怪的。