六 十 干 支

初稿: 2018年10月     最近一次重大修訂: 2019年7月7日


干支是中國傳統的紀數系統,現在還在使用。干支紀數是由天干和地支組合。天干有十個,地支有十二個,每一個地支有一種動物與之對應,稱為生肖或屬相。下表列出所有天干﹑地支及其對應的十二生肖。


表 一: 天 干 和 地 支
天干地支生肖
11
22
33
44
55
66
77
88
99
1010
11
12

干支紀數由甲子(1,1)起,然後是乙丑(2,2)、丙寅(3,3)、丁卯(4,4)……癸酉(10,10)。到癸酉時天干用盡了,之後的規則是凡是天干或地支用盡後須從頭數起,所以癸酉之後是甲戌(1,11)、乙亥(2,12)、丙子等等直到癸亥(10,12)。癸亥後的干支是甲子(1,1),然後是乙丑(2,2)等等循環不息。如下表所示,從甲子到癸亥一共有六十個干支。

表 二: 六 十 干 支
1甲子16己卯31甲午46己酉
2乙丑17庚辰32乙未47庚戌
3丙寅18辛巳33丙申48辛亥
4丁卯19壬午34丁酉49壬子
5戊辰20癸未35戊戌50癸丑
6己巳21甲申36己亥51甲寅
7庚午22乙酉37庚子52乙卯
8辛未23丙戌38辛丑53丙辰
9壬申24丁亥39壬寅54丁巳
10癸酉25戊子40癸卯55戊午
11甲戌26己丑41甲辰56己未
12乙亥27庚寅42乙巳57庚申
13丙子28辛卯43丙午58辛酉
14丁丑29壬辰44丁未59壬戌
15戊寅30癸巳45戊申60癸亥

由於干支數是循環的,表一和表二並非顯示干支的最好方法,較好的方法是將天干和地支排列在圓環之上:


天干圖 地支圖


六十干支圖


從這些圖可見每一個天干、地支和干支組合地位平等,現在天干、地支和干支的數序只是根據傳統的習慣來定而已。

干支可用來紀年﹑紀月﹑紀日和紀時,但是現在已很少用干支來紀月﹑紀日和紀時了。下面簡略介紹如何用干支來紀年﹑紀月﹑紀日和紀時。


干 支 紀 年

現在的農曆年一般只用干支紀年,六十年循環一週。最近一週始於1984年農曆甲子年。其他公曆y年的農曆年干支可用同餘算術算出。所謂公曆y年的農曆年是指年首最接近公曆y年1月1日的農曆年。例如2018年的農曆年是指農曆戊戌年,始於公曆2018年2月16日,終於2019年2月4日。

農曆年的天干十年循環一週,年地支十二年循環一週。已知1984年的農曆年干支為甲子,以mod(X,Y)表示X除以Y後所得之餘數,可推出公曆y年之農曆年天干數為 1 + mod(y+6, 10),即將公曆年數加六,除以十,然後把所得的餘數加一。年地支數為 1 + mod(y+8, 12)。依此可算出2018年之農曆年天干數為五,即戊,地支數為十一,即戌。所以2018年之農曆年干支是戊戌。


月 建 和 「三 正」

月建是指農曆月的地支名,但不計閏月,閏月沒有月建。由於一年有十二個月(不計閏月),每一個月有固定的月建。建子月取含冬至的月份,建丑月是下一個月(不計閏月),餘類推。月建在早期曆法頗為重要。

傳說早期各朝代以不同的月建作為一年的年首。據說夏代以建寅(即現在的正月)的月份為第一個月;商朝以建丑(即現在的十二月)為第一個月;周朝以建子的月份(現在的十一月)為第一個月。每次更改月份次序,就把更改後的第一個月稱為「正月」,「正」是改正的意思。所以夏正為建寅,殷正為建丑,周正為建子。夏正﹑殷正和周正稱為「三正」。

現在一般認為三正之傳說不可信。戰國時代,各國施行不同曆法,當時通行的曆法主要有六種:周曆、魯曆、殷曆、夏曆、黃帝曆和顓頊曆,合稱「古六曆」。六曆之名並非是不同時期不同朝代所制定,而是戰國時期的曆法家托古而作。所謂「三正」,只是指夏曆、殷曆和周曆所用的三個不同年首。所以「三正」不是夏商周三朝交替使用的曆法年首,而是春秋戰國時期不同地域施行曆法的三個不同年首。

秦朝的曆法和顓頊曆很接近,兩者都是以建亥(現在的十月)作為一年之始,但仍依夏曆稱建亥為十月,曆法的月序是十月、十一月、十二月、正月、二月……九月。漢朝建立後基本上沿用秦曆,直到漢武帝太初元年(公元前104年)才頒行新曆法,以建寅(正月)為年首。此後二千多年來,除了王莽和魏明帝一度改用殷正,武則天和唐肅宗一度改用周正外,一般都用夏正,到現在仍通行。

最後要指出,「建」是指北斗七星的斗柄,即玉衡、開陽和瑤光三星(見圖一)。方位可用十二地支表示,方法是將地平圈分為十二等分來配十二地支,北方是子,東方是卯,南方是午,西方是酉(見圖二)。在古代,北斗七星比現在更接近北天極,在中原地區(約北緯35°)大約在唐朝以前斗柄全年都在地平線之上,那時冬至傍晚可見斗柄指向北(子),所以含冬至的月份稱為建子。由於歲差的原故,現在北斗七星離北天極較遠。在中原地區,冬至傍晚瑤光在地平線以下,玉衡和開陽在北方地平線附近。現在要去到北緯41°以北的地方才可看到斗柄北指。北緯41°大概在現在的內蒙古呼和浩特市、河北省承德市、遼寧省錦州市等地區。

北斗七星
圖一: 北斗七星
地支與方位
圖二: 地支與方位


干 支 紀 月

干支紀月較為複雜,據維基百科所述,有兩種干支紀月法。我在年曆網頁裡使用了第一種紀月法。其實干支紀月即使在古代的史書和日曆裡也不常用,干支紀月最常用於占卜和風水。年曆網頁裡自漢武帝太初元年(公元前104年)起才註有月干支。這裡姑且也簡單介紹兩種干支紀月法。


第一種紀法

此一紀法以農曆月配干支,但不計閏月,閏月的干支取上一月的干支。紀法是把月建配上天干,六十月(即五年)循環一週。由於年天干的週期是十年,年干與月干有二對一的對應關係。例如年干為甲或己時,正月的干支必然是丙寅,二月是丁卯,其餘可以類推。下表列出月干支與年天干的關係。


年天干正月二月三月四月五月六月七月八月九月十月十一月十二月
甲、己丙寅丁卯戊辰己巳庚午辛未壬申癸酉甲戌乙亥丙子丁丑
乙、庚戊寅己卯庚辰辛巳壬午癸未甲申乙酉丙戌丁亥戊子己丑
丙、辛庚寅辛卯壬辰癸巳甲午乙未丙申丁酉戊戌己亥庚子辛丑
丁、壬壬寅癸卯甲辰乙巳丙午丁未戊申己酉庚戌辛亥壬子癸丑
戊、癸甲寅乙卯丙辰丁巳戊午己未庚申辛酉壬戌癸亥甲子乙丑

從上表可方便算出任何農曆年的月干支。例如2018年是農曆戊戌年,從上表可知年天干為戊的五月干支是戊午,所以戊戌年的五月干支是戊午。有《五虎遁月歌》歌訣以便記憶正(寅)月的月干與年干的關係: 甲己之年丙作初,乙庚之歲戊為頭,丙辛歲首從庚起,丁壬壬位順流行,若問戊癸何方法,甲寅之上好推求。

其實要算出某年的月干只需記住年干為甲時正月的月干是丙就可以了,其他月的月干可先計算其與甲年干的月數,然後用同餘算術推出其月干。這裡以戊戌年五月為例,戊是甲之後的四個天干,所以如果以甲年算起,戊年五月就是甲年的 (4×12+5) 或五十三月,戊年五月的天干是丙往下數第五十二個天干,由於mod(52, 10) = 2,即五十二除以十之餘數為二,丙以後的第二個天干是戊,所以戊戌年的五月的干支是戊午。

這種紀法為明朝和清朝欽天監編的官方曆書所採用(見存世明清曆書,例如明嘉靖三年大統曆清康熙九年時憲曆等),也用於近代曆書(例如《100年袖珍干支月曆》,劉寶琳(紫金山天文臺研究員)編,商務印書館(香港), 1993)。如上述,閏月沒有月建,據明清的曆書所載,閏月的月干支以月內之節氣劃分,節氣之前用前月的干支,節氣之後用下月的干支。例如清康熙九年閏二月,月內有節氣清分在閏二月十五,清明前用正月干支(己卯),清明後用三月干支(庚辰)。


第二種紀法

這種紀法不依農曆的月份,而是根據二十四節氣分月。子月定為由大雪至小寒前一日,丑月定為由小寒至立春前一日等等。下表列出各月對應的節氣段,近似農曆月份,和近似的公曆日期。


月地支節氣段近似農曆月份近似公曆日期
大雪至小寒前一日十一月12月7日–1月5日
小寒至立春前一日十二月1月6日–2月3日
立春至驚蟄前一日正月2月4日–3月5日
驚蟄至清明前一日二月3月6日–4月4日
清明至立夏前一日三月4月5日–5月5日
立夏至芒種前一日四月5月6日–6月5日
芒種至小暑前一日五月6月6日–7月6日
小暑至立秋前一日六月7月7日–8月7日
立秋至白露前一日七月8月8日–9月7日
白露至寒露前一日八月9月8日–10月7日
寒露至立冬前一日九月10月8日–11月6日
立冬至大雪前一日十月11月7日–12月6日

二十四節氣是根據太陽在天球上的位置而定,不考慮月相,所以是純陽曆。公曆也是純陽曆,所以以上各月的公曆日期每年最多只有一兩日之差。農曆是陰陽曆,既考慮月相也顧及太陽位置,以上各月的起始日期在農曆中可以有多至三十日的變動。

古代稱由冬至到下一個冬至的週期為歲,稱由農年正月初一到下一年正月初一的週期為年。所以歲是純陽曆的概念,而年則屬陰陽曆。一歲的週期是三百六十五或三百六十六日,平均值接近回歸年(365.242日)。一年的週期大約是三百五十四日(無閏月時)或約三百八十四日(有閏月時)。用這種節氣定月的法則,一歲有十二個月,每月大至有三十或三十一日,沒有閏月。月份配上天干,六十月(即五歲)循環一週。


干 支 紀 日

日干支以六十天循環一週。中國最遲從春秋魯隱公三年(公元前720年)起就有史藉用干支紀日,距今已有二千七百多年,其間干支紀日既沒有間斷,又沒有發生過錯亂。

日的干支可從該日的儒略日數以同餘算術推出。儒略日數是指從公元前4713年1月1日正午起算的積日,所以每日正午的儒略日數是整數。這裡沒有說明所用的時間標準(UT1 或地方時等),是假設了起算時刻(公元前4713年1月1日正午)和每日正午所指的時刻用相同的時間標準。公曆某月日的儒略日數有公式計算(例如维基百科),我也建立了儒略日數和日干支計算器網頁,提供公曆日期與儒略日數和日干支的轉換。

由於日干支的週期是六十天,只要知道某一儒略日數的日干支,便可用同餘算術推出儒略日數和日干支的關係。查2019年曆,得知公元2019年1月27日的日干支是甲子,而該日正午的儒略日數是2458511。從mod(2458511, 60) = 11,可推出某日正午儒略日數JD正午與日干支的關係是

日干支數 S=1+mod(JD正午-11, 60)。      (1)

此處干支數是指按上面表二所列的干支次序,即1代表甲子、2代表乙丑、3代表丙寅等等。若以T代表天干數及B代表地支數,即T和B是上面表一列出的天干和地支次序,則知道了S後便可用以下公式計算天干數和地支數:

T=1+mod(S-1, 10),   B=1+mod(S-1, 12)。      (2)

干支數S雖然在古代曆法計算中有時有用,但我認為在大多數情況下是不必要的。天干數T和地支數B可以直接用JD正午計算。這可從日天干的週期是十天、日地支週期是十二天、以及上述JD正午=2458511對應的日干支是甲子(T=1、B=1)推出。從mod(2458511, 10) = 1及mod(2458511, 12) = 11得出以下公式:

T=1+mod(JD正午-1,10), B=1+mod(JD正午+1,12)。      (3)

這公式甚為方便,尤其是我們用十進制,天干數T根本不用計算。T基本上就是JD正午的最後一個數位的數,唯一例外是如果該數是0,則T是10。現在看一算例:公元1781年3月13日正午的儒略日數是2371629,因此T=9,天干是壬;B=1+mod(2371630,12)=11,地支是戌,所以日干支是壬戌。

順帶一提,用JD正午也很容易計算星期。星期的週期是七天,已知2019年1月27日是星期日、JD正午=2458511、mod(2458511, 7)=6,由此可推出星期數W和JD正午的關係如下:

W = mod(JD正午+1, 7)      (4)

星期數W=0代表星期日、W=1代表星期一、W=2代表星期二等等。年曆網頁的星期就是用公式(4)計算。

又順帶一提,知道了干支數S後,天干數T和地支數B可用公式(2)輕易計算。反過來,知道天干數T和地支數B後,要求干支數S就要解以下的同餘方程:

S ≡ T (mod 10),    S ≡ B (mod 12)。

此處≡符號表示同餘。上面公式是說S-T可被10整除、S-B可被12整除。如果不熟悉同餘算術,要找出一條算式來表示S也許會有點困難。對於某一特定的T和B,當然可以查表二找到答案。如果認為查表二等於「作弊」,可以用以下公式計算:

先算 k=6T-5B,如果k>0,則 S=k; 如果k≤0,則 S=k+60。也可以證明k>0等同於T≥B,k≤0等同於T<B,而T-B必定是偶數。[1]

以上面算出的壬戌干支為例,T=9、B=11,k=6×9-5×11=-1,所以S=59,正是表二列出壬戌的干支次序。

以上所述的同餘算術問題並不難。我沒有正式學過同餘算術理論,但仍能輕易求出其解,原因是求解過程中不須要用到如大衍求一術這樣精妙的算法[2]。稍為艱難的算題見於《孫子算經》,即著明的「物不知數」算題:[3]「今有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二。問物幾何?」用現代數學算式表示,就是要求一整數x,使得

x ≡ 2 (mod 3),   x ≡ 3 (mod 5),   x ≡ 2 (mod 7)。

中國古代學者在計算曆法時遇到了不少同餘算術問題(尤其是計算上元積年),很可能因此深入研究同餘算術,發現了著明的孫子定理,西方稱為「中國剩餘定理」。


干 支 紀 時

古時將一日分為十二時辰。用現在通用的時間系統來說,一時辰相當於現在的二小時。十二時辰正好配十二地支,所以時辰一般只提地支,不理天干。以現時通用的時間系統來說,子時是晚上十一時至凌晨一時,丑時是凌晨一時至三時,其餘可以類推。

十二時辰配上天干後,就有六十時辰(即五日)的週期。日干的週期是十日,所以日干與時干有二對一的對應關係,頗似年干與月干的關係。日干與時干也有類似的對照表,但我認為只須知道日干為甲的子時天干是甲就可以了,其他時干可用同餘算術推出。這裡以丁日的未時為例,丁是甲之後的第三個天干,未是第八個地支,丁日的未時即從甲日算起的第(3×12 + 8)個時辰,即第四十四個時辰,所以其天干是從甲起往下數四十三個天干,四十三除以十餘數是三,甲之後第三個天干是丁,所以丁日未時的時辰干支是丁未。



備 註