根據公曆日期計算當日干支(詳解)

一、口訣:乘五除四九加日,雙月間隔三十天。一二自加整少一,三五七八十尾前。二、舉例說明:例一:1996年1月16日(96×5+96÷4+9+16)÷60=8餘49,49即為六十甲子序數。9對應天干壬,49除12餘1對應地支子,對應干支為「壬子」。例二:1997年2月16日(97×5+97÷4+9+16+30+2)÷60=9餘26,26即為六十甲子序數。6對應天干己,26除12餘2對應地支丑,對應干支為「己丑」。例三:1998年3月16日(98×5+98÷4+9+16)÷60=8餘59,對應干支為「壬戌」。例四:1999年4月16日(99×5+99÷4+9+16+30+1)÷60=9餘35,對應干支為「戊戌」。例五:2000年7月16日(100×5+100÷4+9+16+2)÷60=9餘12,對應干支為「乙亥」。例六:20001年10月16日(101×5+101÷4+9+16+4+30)÷60=9餘49,對應干支為「壬子」。三:註解:第二句逢雙月外加30。第三句中的「整少一」,為能被4整除之年一二月份比其他三年都要少加一;第四句反映的是大月規律,3月不加,4、5月加1,6、7月加2,8月加3,9、10月加4,11、12月加5。在介紹求年干支和日干支的公式前,先把干支的特點介紹一下。干支是天乾和地支的組合。天干有十個,即甲、乙、丙、丁、戊、己、庚、辛、壬、癸;地支有十二個,即子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥。天乾和地支從「甲子」開始,按順序逐一相配,各用到最後一個時,再從第一個開始繼續相配,就形成了六十個干支,也稱「六十花甲子」。為什麼是六十個干支呢?這個從數學上很容易回答。根據干支的構成條件,其循環周期必然是天干數和地干數的最小公倍數。而60正是10和12的最小公倍數。  如果我們把「甲子」編為1號,「乙丑」編為2號,這樣編下去,就可以得到一個干支和序號的對照表,如下:1.甲子2.乙丑3.丙寅4.丁卯5.戊辰6.己巳7.庚午8.辛未9.壬申10.癸酉11.甲戌12.乙亥13.丙子14.丁丑15.戊寅16.己卯17.庚辰18.辛巳19.壬午20.癸未21.甲申22.乙酉23.丙戌24.丁亥25.戊子26.己丑27.庚寅28.辛卯29.壬辰30.癸巳31.甲午32.乙未33.丙申34.丁酉35.戊戌36.己亥37.庚子38.辛丑39.壬寅40.癸卯41.甲辰42.乙巳43.丙午44.丁未45.戊申46.己酉47.庚戌48.辛亥49.壬子50.癸丑51.甲寅52.乙卯53.丙辰54.丁巳55.戊午56.己未57.庚申58.辛酉59.壬戌60.癸亥  細心觀察這張表,不難發現,由序號得到對應干支是很容易的,序號除以10的餘數就是天乾的序數(如果餘數是0,則為最後一個天干癸),序號除以12的餘數就是地支的序數(如果餘數是0,則為最後一個地支亥)。比如37號干支,因為37mod10=7(mod表示取餘數),對應的天干是庚,37mod12=1,對應的地支是子,所以37號干支就是庚子。顯然,一個整數除以10的餘數就是它的個位數,這就使求天干更方便了。  而由干支推它的序號,也不困難。這其實就是一個同餘方程組的求解問題,我們用初等數論中的中國剩餘定理就可以解決。比如要算戊午的序號是多少,根據上面由序號得到對應干支的原理,很容易得到如下方程組:{xmod10=5{xmod12=7.其中x是待求的干支序號。根據中國剩餘定理,有:x≡6*5-5*7(mod60)=55,即戊午的序號是55.這和上面的對照表的是一致的。一般地,若天乾的序號為m,地支的序號為n,則干支的序號為:x≡6m-5n(mod60)(1)簡單點說,如果6m-5n的結果是正數,這個數就是干支的序號;如果是負數,把它加上60就是干支的序號。  了解了干支及其序號的相互推算,下面我們先來介紹年干支的求算。需要說明的是,干支紀年紀的是農曆年,而不是公曆年。但因為農曆年的歲首和公曆年的歲首相隔較近,使農曆年總是和某一公曆年的大部分重合,因此,通常也用公曆年的年份表示和它大部分重合的農曆年。這樣我們就很容易給出農曆年的干支序號為:x=(Y-3)mod60,(2)其中Y是年份。得到了干支序號x,就可以求出相應的干支來。比如2004年的干支序號:x=(2004-3)mod60=2001mod60=21,21mod10=1,天干為甲,21mod12=9,地支為申,因此,2004年是甲申年。  細心觀察,我們可以發現,其實用Y-3直接除以10,就可以得到天干,用Y-3直接除以12,就可以得到地支。這是因為x=(Y-3)mod60等價於Y-3=60*n+x,其中n是Y-3除以60的商數。等式兩邊同時除以10,餘數也必然相等。而右邊第一項是60的倍數,自然也是10的倍數,能夠被10整數,於是Y-3除以10的餘數就必然等於x除以10的餘數。因此,其實我們完全用不著先求干支的序號,而可以分別求天乾和地支,合起來就是干支,這樣就減少了一步運算。而對於年份的天干,同樣只須看末尾一位。末尾為4的年份的天干總是甲,末尾為5的年份的天干總是乙……依次類推。  再來看日干支的求算。我們可以仿照星期的求算,得到一個比較直觀的計算日干支的公式如下:G=(Y-1)*5+[(Y-1)/4]-[(Y-1)/100]+[(Y-1)/400]+D+15,(3)其中Y是年份,D是累積天數,[...]表示取商數,也就是只取計算結果的整數部分。把G除以60,餘數就是干支的序號。或者把G除以10或12,可以直接得到日天乾和日地支。不過,和形式相似的求星期的公式一樣,這個公式還不夠簡煉,特別是第一項(Y-1)*5,在Y為四位數年份時,計算出來的結果是一個較大的四位數或五位數,口算很不方便。  我們用推導蔡勒公式的辦法,可以改進這個公式。先來看和年份有關的部分的改進。我們知道,按公曆的置閏規則,一個世紀的總天數可能是36524天,或36525天。如果這個世紀中末尾為00的年份是閏年,這個世紀就只有36525天;否則就只有36524天。我們不妨稱有36524天的世紀為「平世紀」,有36525天的世紀為「閏世紀」。對於平世紀,因為36524mod60=44,所以,每過一個平世紀,同一天的干支就向後推進44個序號。同樣,每過一個閏世紀,同一天的干支就向後推進45個序號。這就使我們很容易得到一個計算每個世紀第一年(年份末尾為01)3月1日的公式:G=44C+[C/4]+15,(4)其中C是世紀數減一。而計算任一年3月1日的干支的公式也可以很快得到:G=44C+[C/4]+5(y-1)+[y/4]+15,即G=44C+[C/4]+5y+[y/4]+10,(5)其中y是年份後兩位數字。  下面我們再列出每月天數:月  份 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月---------------------------------------------------------------------------天  數 3128(29)31303130313130313031減30後的剩餘天數1-2(-1)1010110101如果把1月和2月看成是上一年的13月和14月,同樣可以得到下面的式子:D』≡[3*(M+1)/5]+d-2(mod10)(6)及D』≡[3*(M+1)/5]+d-2+i(mod12)(奇數月i=0,偶數月i=6),(7)其中,D』是從3月1日開始算起的累積天數,M是月份,d是日數。把(6)(7)兩式和(5)式合起來,再進行適當的化簡,就得到了計算公曆任意一天的天乾和地支的公式:g=4C+[C/4]+5y+[y/4]+[3*(M+1)/5]+d-3;(8)z=8C+[C/4]+5y+[y/4]+[3*(M+1)/5]+d+7+i(奇數月i=0,偶數月i=6)(9)如果先求得了g,那麼z=g+4C+10+i(奇數月i=0,偶數月i=6).(10)g的個位數就是天干序號,z除以12的餘數就是地支序號。這裡需要再次強調:1月和2月是當做上一年的13月和14月來算的,因此C和y也要按上一年的年份來取值。  我們可以把(8)(9)兩式和蔡勒公式對比一下:W=-2C+[C/4]+y+[y/4]+[13*(M+1)/5]+d-1,可以看出它們的形式非常相似,區別僅僅是幾個常數的不同。  儘管現在中國已經不用干支紀日了,但有時還是需要計算日干支的。比如,曆法有所謂「三伏」和「入梅」「出梅」,都和日干支有關。三伏包括初伏、中伏和末伏,是指夏天最熱的一段時間,入梅和出梅是指江南一帶梅雨季節的開始和結束,本來是和氣候有關的用語。但因為古代沒有準確的天氣預報,無法準確預測三伏和入出梅的時間,所以就在曆書上硬性規定幾個日子作為三伏開始和入出梅的日子,這樣確定一個大致的日期以備參考。現在雖然有了比較準確的天氣預報,但三伏和入出梅作為一種傳統曆法,仍然流傳下來。  曆法規定夏至之後的第三個庚日為初伏開始,共十天;第四個庚日為中伏開始,十天或二十天;立秋之後的第一個庚日為末伏開始,共十天。中伏的長度之所以不固定,是因為夏至、立秋的日期和庚日的日期是逐年浮動的,立秋之後的第一個庚日可能是夏至之後的第五個庚日,也可能是第六個庚日。如果是前者,中伏就只有十天;如果是後者,中伏就長達二十天。注意如果夏至當天是庚日,夏至之後第一個庚日是指夏至之後第十天,而不是夏至當天,這時初伏第一天就是夏至之後第三十天。同樣,如果立秋當天是庚日,末伏第一天就是立秋之後第十天,而不是立秋當天。入梅則是指芒種之後的第一個丙日,出梅是指小暑之後的第一個未日,也有同樣的規定。  知道了這些,我們可以算一下2004年的初伏、中伏和末伏都是什麼日子。這需要先知道夏至和立秋的日子。如果知道夏至是6月21日,立秋是8月7日,那麼運用公式(8),夏至這天的g為:g=4*20+[20/4]+5*4+[4/4]+[3*(6+1)/5]+21-3=80+5+20+1+4+21-3=128,個位數是8,天干是辛。夏至之後第三個庚日就是夏至之後第29天,也就是7月20日,這天也就是初伏第一天。中伏第一天則是7月30日。同樣可算出立秋這天的g為:g=4*20+[20/4]+5*4+[4/4]+[3*(8+1)/5]+7-3=80+5+20+1+5+7-3=115,是個戊日。立秋之後第一個庚日就是立秋之後第2天,也即8月9日,這天就是末伏第一天。由此也可知,2004年的中伏只有十天。同樣可以由芒種和小暑兩節氣的日期,算出2004年的入梅日和出梅日分別是6月6日和7月15日。  反過來,知道了年干支和日干支,求相應的年份和日期就相對麻煩一點了。因為干支是循環使用的,所以必須先知道欲求對應年份和日期的干支是屬於哪一次循環。比如我們預先用公式(2)算出來1864、1924、1984年都是甲子年,如果要知道戊戌變法是哪一年,首先要確定它是十九世紀末的事情,也即是屬於1864年開始的這一個循環里。那麼,我們用公式(1)可以算出來戊戌的序號是35,於是戊戌年就是(1864-1)+35=1898年。之所以要先減一,是因為甲子的序號為1,需要把這個序號先減去。  至於日干支,因為古書里的日干支總是和年、月配合使用的,所以不難確定它屬於哪個循環。比如《明史·庄烈帝本紀》記載明崇禎皇帝朱由檢在煤山自縊的日子是崇禎十六年三月丁未。崇禎十六年就是公元1644年。三月雖然是農曆的三月,但我們知道農曆的日期在公曆里雖然是浮動的,但也不出一定的範圍,比如農曆三月初一,總是在公曆3月22日到4月19日之間浮動。因此,先來算1644年3月22日的干支。我們有:g=4*16+[16/4]+5*44+[44/4]+[3*(3+1)/5]+22-3=64+4+220+11+2+22-3=320,個位數是0,z=g+4C+10=320+64+10=394,除以12餘10,所以這一天的干支是癸酉,其序號為6*0-5*10+60=10。而丁未的序號是6*4-5*8+60=44,在癸未之後34天,因此三月丁未肯定是3月22日之後34天,即4月25日。這就是說,崇禎自縊的日子是1644年4月25日,這和查萬年曆的結果是一致的。
推薦閱讀:

用英語表達日期和時間,你會多少?
出生日期里哪個數字越多越富
玄真閣:出生日期尾數是幾,天生長壽命,一生富貴多金
還在為挑選結婚日期而發愁嗎?
出生日期看你有怎樣的特質

TAG:計算 | 公曆 | 日期 | 干支 |