?? sm2.htm
字號(hào):
<html><head><title>幫助</title></head>
<body>
<center>
<table width=780 border=0 cellpadding=3 cellspacing=0>
<tr><td style='line-height:150%;font-size:16px;text-indent: 20'>
<p><a href="readme.htm">返回</a></p>
<p align=center><b>第二章 公歷與儒略日</b></p>
<p><b>概述</b></p>
<p>選自本人的《天文算法》部分譯文</p>
<p>公歷中規(guī)定平年有365日,閏年366日。每年含有12個(gè)月。</p>
<p>在1582年10月4日以前,公歷規(guī)則定每4年設(shè)置一個(gè)閏年,平均年長(zhǎng)度為365.25天,這期間的公歷稱為儒略歷。在1582年10月15日之后則規(guī)則定每400年97閏,平均年長(zhǎng)度為365.2425天,這期間的公歷稱之為格里高利歷。 格里高利歷并非在所有國(guó)家迅速得到一致采用,這一點(diǎn)在歷史研究中要引起注意。例如在大不列顛,晚至公元1752年才變更歷法,而土耳其則要等到1927年。</p>
<p>由于儒略歷存在嚴(yán)重的“多閏”問(wèn)題,到了1582年,公歷跑快了10天左右,當(dāng)時(shí)就人為調(diào)整了10天,并從此改用格里歷。因此務(wù)必注意1582年10月4日(儒略歷)的下一日為1582年10月15日(格里高利歷)。也就是說(shuō)1582年10月份少了10天。</p>
<p><b>閏年的具體設(shè)置</b></p>
<p>在儒略歷中,能被4整除的年份為閏年,這一年有366天,其它年份為平年(365天)。 如900年和1236年為閏年,而750年和1429年為平年。</p>
<p>格里高利歷法也采用這一規(guī)則,但下列年份除外:不能被400整除的百年為平年,如1700年,1800年,1900年和2100年。其余能被400整除的百年則為閏年,如1600年,2000年和2400年。 </p>
<p><b>儒略歷的擴(kuò)展</b></p>
<p>儒略歷由尤里烏斯·愷撒于公元前45年在羅馬帝國(guó)創(chuàng)立,而其最終形式確立于公元8年前后,盡管如此,我們?nèi)钥梢越柚煳膶W(xué)家的演算無(wú)止境地向前推算儒略歷。比如在這一系統(tǒng)中,我們可以說(shuō)某次日食發(fā)生在公元前1203年8月28日,雖然在那個(gè)遙遠(yuǎn)的年代,羅馬帝國(guó)根本還未被創(chuàng)建,而8月這個(gè)月份更有待設(shè)立。</p>
<p>對(duì)于公元1年之前的年份如何計(jì)數(shù),天文學(xué)家同歷史學(xué)家并不一致。在本書(shū)中,“公元前”的年份以天文方法計(jì)數(shù)。這樣,+1年的前一年為0年,再之前才是-1年。所以歷史學(xué)家所說(shuō)的公元前585年實(shí)際上是-584年。</p>
<p>天文上以負(fù)數(shù)計(jì)數(shù)年份只是為算術(shù)目的起見(jiàn)。比如,在歷史學(xué)計(jì)數(shù)中的,可被4整除的年份為儒略歷閏年這個(gè)規(guī)則不再有效了。雖然像公元前1,5,9,13,…這些年份的確也在天文學(xué)上的閏年序列中,然而它們卻被記為0,-4,-8,-12 …,它們都能被4整除。</p>
<p>我們以INT(x)來(lái)表示數(shù)x的整數(shù)部分,即小數(shù)點(diǎn)前的整數(shù)。例如:</p>
<p>INT(7/4) = 1 INT(5.02) = 5</p>
<p>INT(8/4) = 2 INT(5.9999) = 5</p>
<p>對(duì)于負(fù)數(shù),這里的INT(x)指小于等于x的最大整數(shù)。那樣的話就有INT(-7.83) = -8。如果你的程序是javascript,取整函數(shù)是 Math.floor(x),它返回小于等于x的最大整數(shù)。如果你用的是C++,那么用 (int)x 強(qiáng)制轉(zhuǎn)換,得到是的整數(shù)部分,而不是小于等于x的最大整數(shù)。
<p><b>儒略日數(shù)(簡(jiǎn)稱儒略日)</b></p>
<p>儒略日數(shù)是指從公元 -4712 年開(kāi)始連續(xù)計(jì)算日數(shù)得出的天數(shù)及不滿一日的小數(shù),通常記為 JD (**)。傳統(tǒng)上儒略日的計(jì)數(shù)是從格林尼治平午,即世界時(shí)12點(diǎn)開(kāi)始的。若以力學(xué)時(shí)(或歷書(shū)時(shí))為標(biāo)尺,這種計(jì)數(shù)通常表達(dá)為“儒略歷書(shū)日”,即JDE (**),其中E只是一種表征,即按每天86400個(gè)標(biāo)準(zhǔn)秒長(zhǎng)嚴(yán)格地計(jì)日。例如:</p>
<p>1977年4月26.4日 UT = JD 2443 259.9</p>
<p>1977年4月26.4日 TD = JDE 2443 259.9</p>
<p><b>儒略日的計(jì)算</b></p>
<p>設(shè)Y為給定年份,M為月份,D為該月日期(可以帶小數(shù))。</p>
<p>若M > 2,Y和M不變,若 M =1或2,以Y–1代Y,以M+12代M,換句話說(shuō),如果日期在1月或2月,則被看作是在前一年的13月或14月。</p>
<p>對(duì)格里高利歷有 :A = INT(Y/100) B = 2 - A + INT(A/4)</p>
<p>對(duì)儒略歷,取 B = 0</p>
<p>要求的儒略日即為:JD = INT(365.25(Y+4716))+INT(30.6001(M+1))+D+B-1524.5</p>
<p>使用數(shù)值30.6取代30.6001才是正確的,但我們?nèi)允褂?0.6001,以確保總能取得恰當(dāng)?shù)恼麛?shù)。事實(shí)上可用30.601甚至30.61來(lái)取代30.6001。例如,5乘30.6精確等于153,然而大多數(shù)計(jì)算機(jī)不能精確表示出30.6,這導(dǎo)致得出一個(gè)152.999 9998的結(jié)果,它的整數(shù)部分為152,如此算出的JD就不正確了。</p>
<p>
下表列出了一些歷日所對(duì)應(yīng)的儒略日,可作測(cè)試程序之用。<br>
2000年 1月 1.5日 2451 545.0<br>
1987年 1月27.0日 2446 822.5<br>
1987年 6月19.5日 2446 966.0<br>
1988年 1月17.0日 2447 187.5<br>
1988年 6月19.5日 2447 332.0<br>
1900年 1月 1.0日 2415 020.5<br>
1600年 1月 1.0日 2305 447.5<br>
1600年12月31.0日 2305 812.5<br>
837年 4月10.3日 2026 871.8<br>
-1000年 7月12.5日 1356 001.0<br>
-1000年 2月29.0日 1355 866.5<br>
-1001年 8月17.9日 1355 671.4<br>
-4712年 1月 1.5日 0.0
</p>
<p><b>由儒略日推算歷日</b></p>
<p>將JD加上0.5,令 Z 為其整數(shù)部分,F(xiàn) 為尾數(shù)(小數(shù))部分。</p>
<p>若 Z < 2299161,取A = Z</p>
<p>若 Z 大于等于2299 161,計(jì)算 α=INT((Z-1867216.25)/36524.25) ,A=Z+1+α-INT(α/4)</p>
<p>然后計(jì)算</p>
<p>B = A+1524</p>
<p>C = INT((B-122.1)/365.25)</p>
<p>D = INT(365.25C)</p>
<p>E = INT((B-D)/30.6001) </p>
<p>該月日期(帶小數(shù)部分)則為:d = B - D - INT(30.6001E) + F</p>
<p>月份m為: <br>
IF E < 14 THEN m = E – 1 <br>
IF E=14 or E=15 THEN m = E – 13 <br>
</p>
<p>年份為y:<br>
IF m>2 THEN y = C – 4716
IF m =1 or m=2 THEN y = C – 4715
</p>
<p>這個(gè)公式里求E時(shí)用的數(shù)30.6001不能代之以30.6,哪怕計(jì)算機(jī)沒(méi)有先前所說(shuō)的問(wèn)題。否則,你得到的結(jié)果會(huì)是2月0日而不是1月31日,或者4月0日而不是3月31日。</p>
<pre>
<b>算法實(shí)現(xiàn)范例(JavaScript)</b>
function int2(v){ return Math.floor(v); } //取整數(shù)部分
var JD={ //日期元件
Y:2000, M:1, D:1, h:12, m:0, s:0,
toJD:function(){ //公歷轉(zhuǎn)儒略日
var y = this.Y, m = this.M, n = 0; //取出年月
if(m<=2) m+=12, y--;
if(this.Y*372+this.M*31+this.D>=1582*372+10*31+15)//判斷是否為格里歷
n = int2(y/100), n = 2-n+int2(n/4);//加百年閏
n += int2(365.25*(y+4716)+0.01); //加上年引起的偏移日數(shù)
n += int2(30.6001*(m+1))+this.D; //加上月引起的偏移日數(shù)及日偏移數(shù)
n += ((this.s/60+this.m)/60+this.h)/24 - 1524.5;
return n;
},
setFromJD:function(jd){ //儒略日數(shù)轉(zhuǎn)公歷
jd += 0.5;
var A = int2(jd), F = jd-A, D; //取得日數(shù)的整數(shù)部份A及小數(shù)部分F
if(A>=2299161) D=int2((A-1867216.25)/36524.25),A+=1+D-int2(D/4);
A += 1524; //向前移4年零2個(gè)月
this.Y = int2((A-122.1)/365.25);//年
D = A-int2(365.25*this.Y); //去除整年日數(shù)后余下日數(shù)
this.M = int2(D/30.6001); //月數(shù)
this.D = D-int2(this.M*30.6001);//去除整月日數(shù)后余下日數(shù)
this.Y-= 4716; this.M--;
if(this.M>12) this.M -= 12;
if(this.M<=2) this.Y++;
//日的小數(shù)轉(zhuǎn)為時(shí)分秒
F*=24; this.h=int2(F); F-=this.h;
F*=60; this.m=int2(F); F-=this.m;
F*=60; this.s=F;
}
}
</pre>
<p><b>星期幾的問(wèn)題</b></p>
<p>在公歷中,星期是按7天一個(gè)循環(huán)計(jì)日,周而復(fù)始。中國(guó)的干支記法與星期記法的算法的實(shí)現(xiàn)幾乎完全相同。</p>
<p>給定日期是星期幾可由以下方法獲得 — 計(jì)算該日0時(shí)的儒略日,加上1.5,再除以7 ,所得余數(shù)將指示出星期幾:若余數(shù)為0,則為星期日,1為星期一,2為星期二,3為星期三,4為星期四,5為星期五,6為星期六。 </p>
<p>儒略歷到格里高利歷的換算并不影響星期。因而,在1582年,11月4日星期四接下來(lái)的一天便是11月15日星期五。</p>
</td></tr>
</table>
</center>
</body></html>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -