關於公曆年月日與干支的轉化問題(

三、 公元日序數的演算法: 

1、公元1582年10月4日前日子的公元日序數求法: 
不難按曆法知道: 
公元日(P)=365*(年號(Y) -1)+閏年數+ 本年的日數 
根據儒略曆四年一閏的法則(逢被4整除的均置閏)得: 

P = 365*(Y-1)+ [ Y/4] + Q 

式中「[ ]」是取整符號;Q是從要算的日子到1月1日的天數加1,由於公曆的月份有固定的天數,1、3、5、7、8、10、12是大月31天,4、6、9、11日小月30天,2月份置閏月嚴格按28天算,(為了直觀些,稍後我會用坐標來移及一些數學方法,表述成一條用月、日表示的代數式)。 
值得注意的是:閏年時,未到3月1日要減1。 

例1、 公元227年5月4日的公元日序數是:365*226+[227/ 4]+31+28+31+30+4=82670 
例2、 公元1582年10月4日的公元日序數是:365*1581+[1582/4] + 31*5+30*3+28+4 =577737 

2、公元1582年10月15日後的日子的公元日序數求法: 
公元1582年10月15日是公元1582年10月4日的後一天,故其公元日577738(見例2),格列哥里歷按四年一閏,被4整除的均置閏,但逢百年時需被400整除的方置閏,其它百年不置,故四百年有97閏。公式為: 

P=365*(Y-1)+ [Y/4] - [Y/100] +[ Y/400] +Q+15-3-10 
=365*(Y-1)+ [Y/4] - [Y/100] +[ Y/400] +Q +2 

式中第2、3、4項是格列哥里歷的置閏方法。我們可以對照比1582年以前的置閏方法,多了- [Y/100] +[ Y/400]一項,故需減去 - [1582/100]+[1582/400]以校正之;同時從1582年10月4日到1582年10月15日之間跳過了10日,所以同時減去10,使公元日連續。大家可以代入驗算一下,它與此1582年10月4日的序數是連續的。 

例3、 公元1582年10月15日的公元日序數: 
365*1581+[1582/4] - [1582/100] + [1582/400] + 31*5+30*3+28+15+2 =577738 
例4、 公元2003年4月2日的公元日序數: 
365*2002+[2003/4] - [2003/100] + [2003/400] + 31+28+31+2+2 =731309 

3、公元前日子的公元日序數求法: 
儘管儒略曆在公元前46年完成,但以前的日期一般的歷史書均按儒略曆上推,所以也從約定俗成。儒略曆按四年一閏,其公式是: 

公元日序數=365*年號(負號)+閏年數(負號)+本年的日數(正號) 
P= -365*Y - [(Y+3)/4]+Q 

公元前的求法與公元後的有所不同:後者的計算方向從年、從月、從日是一路遠離原點的;前者則是「年」遠離了原點,月、日反過來接近原點,這點大家要記住。 
(如果選取一個很前的原點,則可以使序數的方向永遠為正,但為了便於一般人理解及習慣,我還是放棄了這樣敘述------事實上太初曆等古代曆法一般選取一個很遠的天文日作原點的) 

例5、 公元前1年1月1日的公元日序數是:-365*1- [(3+1)/4 ]+1= -365 
例6、 公元前202年2月28日的公元日序數:-365*202 – [(202+3)/4] + 31+28= -73722 

我們把三個公式並列如下: 
(公式1) 

P= -365*Y - [(Y+3)/4]+Q (公元前) 

P = 365*(Y-1)+ [ Y/4] + Q (公元後至1582年10月4日) 

P=365*(Y-1)+ [Y/4] - [Y/100] +[ Y/400] +Q +2 (1582年10月15日後) 

(以下一段選讀) 
事實上我們可將坐標「平移」,將原點移到公元1年2月28日。將3月1日「作為」一年的開端,平移的目的是為了使置閏放在一年的最後一天,減小置閏對各月份的影響。(事實上我開始推導時是用這方法的,求得結果後才平移成現在的方式)如此,作月份相應減小2,(3=1,4=2,…………1月等於上年的11月,2月是12月),公元日序數則相應增加59。如此則Q的值也可用相關的月(M)、日(D)代數式表示: 
Q=30(M-1)+[0.6(M-1)+0.5] +D 
(這純是個數學問題,我不想在這裡證明。反正是十二個月,大家直接代入看看) 
如此變換後的公式變為:Y年M月D日 (M為正常月減2,1月時為11月) 
(公式二) 
P= -365*Y - [(Y+3)/4]+30M+[0.6M-0.1]+D+29 (公元前) 
P = 365*(Y-1)+ [ Y/4] + 30M+[0.6M-0.1]+D+29 (公元後至1582年10月4日) 
P=365*(Y-1)+ [Y/4] - [Y/100] +[ Y/400] + 30M+[0.6M-0.1]+D+31 (1582年10月15日後) 

四、干支的求法 
知道了一個日子的公元日序數是,要求該日子的干支序數是一個很容易容易的事了,思路是: 
一已知干支的日子———推出原點的干支序數———推出任一歷史日子序數 
(讀者諸公一定想到用類似的方法求有固定周期的朔望了) 
不難知: 
歷史日子的干支序數= (原點的干支序數+ 公元日序數)除以60取餘數 
K=(『K + P)mod 60 

利用例4,公元2003年4月2日的公元日序數是731309,干支乙巳(序數42)則 
42=(『K+731309)mod 60 『K=42-731309= -731267= -47 =13 mod 60 
即原點(公元前1年12月31日)的干支序數為13(丙子),我們將結果代入公式一,則 
(公式三) 

K=(13+P)mod 60 

例7、 求公元1582年10月15日的干支。利用例3的結果有 
K=(577738 + 13)mod 60=11,即該日甲戌。 

我們將公式三代入公式一,則 

K= (-365*Y - [(Y+3)/4]+Q+13 )mod 60 (公元前) 
K= (365*(Y-1)+ [ Y/4] +Q+13 )mod 60 (公元後至1582年10月4日) 
K=(365*(Y-1)+ [Y/4] - [Y/100] +[ Y/400] +Q +15)mod 60 (1582年10月15日後) 


我們當然可以使用數學方法將公式化簡,以下是我使用的化簡式: 
(公式四) Y年M月D日(M從三月開始,M相應減2) 

K= (-5Y-[(Y+3)/4]+30M+ [0.6M-0.1]+ D+42 ) mod 60 (公元前) 
K=(5Y+ [ Y/4] + 30M+ [0.6M-0.1] + D+37)mod 60 (1~1582:10:4) 
K=(5Y+ [Y/4] - [Y/100] +[ Y/400]+ 30M+ [0.6M-0.1]+ D+ 39)mod 60 (1582:10:4以後) 

我用手上天文台編的三千年公曆干支朔望對照表抽樣校對了幾個日子,準確無誤。可見它也是採用同樣原理編訂的。 
反過來,知道干支及大約的月份,求公元日序數(公元歷)只是解方程的問題而已。 

五、舉例及應用 

例8、 漢書所說高祖五年(己亥)二月甲午即皇帝位的,該日的公曆是多少? 
高祖五年己亥是前202年,二月大約在公曆3月附近,干支甲午序數31,代入公式四得 
-202*5 – [(202+3)/4]+30*1+[0.6M-0. 1]+D+42 =31 mod 60 
整理得 -989+D=31 mod 60 D=(31+989 ) mod 60 D=0 mod 60 
解出D=0,或60,即該日是3月0日(2月28日),或過60天以後的4月29日。 

驗算:嚴格按儒略曆四年一閏的演算法,公元前202年2月28日的公元日序數為 –73722, 
-73722+13= -73709 = - 29 =31 mod 60 該日甲午。演算沒錯!! 

六、結語:方法是類似解釋幾何的的方法: 
首先建立一個連續時間坐標, 
第二是根據公曆的規律建立任意日子到原點間的距離公式(公元日序數) 
第三是對於有固定周期的屬性(干支、月相等),可從任一已知屬性的日子利用與原點的距離推出原點的屬性。
第四是根據原點的屬性利用某點與原的距離推知該點的屬性。 
第五公式的化簡與選擇只是一些技術問題。 
推薦閱讀:

周易紀年與公曆紀年的換算
公曆推算日干支方法
公曆七月生肖好運榜
公曆轉換甲子歷不須查萬年曆_見機閣__子與
為什麼19年後公曆和農曆是同一天的

TAG:公曆 | 干支 | 轉化 | 問題 | 關於 |