幹支紀年源於太歲紀年,太歲紀年則源於歲星紀年。歲星即木星,其視運動周期為11.86年,與12個回歸年的長度十分接近,在先秦天象觀測還不是十分精確的情況下,古人以為木星的運行就是12歲一周天,那麼每歲木星運行周天的十二分之一,將木星每歲在恆星間移動的距離作為一次,則周天被分為十二次,木星每歲移動一次。以木星所在之次來稱其歲,即為歲星紀年。由於歲星紀年的周年視運動方向是自西向東(右旋),因而十二次也是由西向東排列,並與二十八宿有一定的對應關係。
古人以左旋為順,以右旋為逆。由於十二次為右旋,因而古人又假設了一個和歲星運行方向相反、軌道相同、速度均勻的理想天體——太歲,並以十二辰來代替十二次以表示太歲每年所在的位置。但也有學者認為十二辰源於北鬥鬥柄的指向。北鬥作為觀象授時的重要星象不僅具有明確的指示時間和季節的作用,而且由於它自身的特殊性,還直接影響著中國傳統天文學體系的建立,並因此受到中國古人的崇拜。
我們知道,地球的自轉軸指向天球北極,這使地球的自轉和公轉所反映出的恆星周日或周年視運動,實際只表現為恆星圍繞天球北極的旋轉,而天極則可視為相對不動。由於華夏文明發祥於北緯36°左右的黃河流域,因此,這一地區的人們觀測到的天北極也就高出北方地平線上36°,這意味著對黃河流域的先人來說,以北天極為中心,以36°為半徑的圓形天區,實際是一個終年不沒入地平的常顯區域,古人把這個區域稱為恆顯圈。北鬥當然是恆顯圈中最重要的星象,而且由於歲差的緣故,它的位置在數千年前較今日更接近北天極,所以終年常顯不隱,觀測十分容易,從而成為終年可見的時間指示星。
隨著地球的自轉,北鬥呈圍繞北天極做周日旋轉,在沒有任何計時設備的古代,可以指示夜間時間的早晚;又隨著地球的公轉,北鬥呈圍繞北天極做周年旋轉,人們根據鬥柄或鬥魁的不同指向,可以了解寒暑季節的變化更迭。古人正是利用了北鬥的這種可以終年觀測的特點,建立起了最早的時間系統。如《鶡冠子·環流》載:「鬥柄東指,天下皆春;鬥柄南指,天下皆夏;鬥柄西指,天下皆秋;鬥柄北指,天下皆冬。」根據鬥柄所指方位定時令,是後世曆法中「鬥建」的起源,《史記·天官書》說:「鬥為帝車,運於中央,臨治四鄉。分陰陽,建四時,均五行,移節度,定諸紀,均繫於鬥。」說明北鬥是定方向、定四時、制天度的標尺,並和陰陽五行緊密聯繫。
北鬥和歲星如標尺和遊標相配成套,天球的十二等分制就可以相當準確地制定了。這種天空的區劃法叫十二辰,由於鬥柄的旋轉所反映的是恆星的周年視運動,因此十二辰的布列是自東向西左旋,以正北方為子,依次類推。這樣,每過一年,歲星依次自西向東右行約30°,叫做一次;而鬥柄所指方位,則依次自東向西左旋約30°,叫做一辰,辰名按十二支排列。對此,《漢書·律曆志》言:「鬥建下為十二辰,視其建而知其次。」清楚地指出十二辰源出於鬥建,鬥建與十二次是逆轉的,但都借用了十二支來命名,歲星所在的次名和鬥建所在的辰名只差一支,即鬥建為辰,歲星為巳,依次類推。這樣,觀察鬥建所指,即使看不見歲星,也能夠知道它在哪一次。
幹支紀年勢必涉及紀年的起點問題,根據《漢書·律曆志》「元法四千五百六十」劉昭注引《樂葉圖徵》可知,幹支紀年法是以日月位於同一辰次,同時又是冬至日的日子作為甲寅年的開始,然後按六十幹支順序來紀年。甲寅是幹支紀年的起點,稱之為「曆元」「天元」。當時的天文學家還企圖找出甲子月甲子日冬至不僅日月合壁而且五星聯珠的日子作為幹支紀年的總起點,即「上元」,如《漢書·律曆志》所載:「漢歷太初元年,距上元十四萬三千一百二十七歲。」以木星運行的位次作為幹支紀年的依據,但木星的實際公轉周期是11.86年,而不是恰好12年,到了西漢晚期,天文曆法學家發現了歲星超辰現象,因而幹支紀年便脫離了歲星運行的具體位置,十二次、十二辰也成為赤、黃道附近周天等分的名稱,已不具有實際的天文學意義。 以太歲紀年時,古人根據太歲與十二辰的聯繫另編了十二個歲名,稱為「歲陰」,為了擴大太歲紀年的範圍,又仿幹支相配以成六十甲子之例,編了一套與十幹相應的「歲陽」名。
歲陽與歲陰相配以紀年,《史記·曆書》記載太初曆的年序,即採用了這套歲名,如漢武帝太初元、二、三的歲名分別是焉逢攝提格、端蒙單閼、遊兆執徐,相當於幹支紀年的甲寅、乙卯、丙辰年。但歲名紀年用起來十分不便,故後人乾脆改用紀日的六十甲子來紀年。一般認為,幹支紀年正式通用的下限為東漢章帝元和二年(公元85年)頒行的四分曆時,迄今沿用未斷。
幹支紀年的推算方法較多,這裡介紹幾種常用的方法:
(1)以任何一個已知年幹支為起點推算。以所求的年數減去已知年數,其差數的個數即為年幹數,其差數除以12所得的餘數即為年支數。以已知年幹支為零,幹支數得正數時順推,負數時逆推。如1987年為丁卯年,求2003年幹支,2003-1987=16,幹為6,支為4(16÷12餘數為4)。以丁為零起算,戊1、己2……順推得6為癸;以卯為零起算,辰1、巳2……順推得4為未,則2003年為癸未年。如求1959年幹支,1959-1987=-28,幹為-8,支為-4。以丁為零起算,丙-1、乙-2……逆推得-8為己;以卯為零起算,寅-1、醜-2……逆推得-4為亥,則1959年為己亥年。
(2)公元年數減3,其差數除以幹支周轉數60,其餘數即幹支所求的代數。即:(所求數-3)÷60=商……餘數(年幹支代數)。如求1963年幹支,則(1963-3)÷60=32餘40,餘數40即為幹支代數,在六十甲子周期表中為癸卯年。
(3)以公元一年即辛酉年為起點推算。以所求年的個位數為幹,以所求年的數目除以12,取其餘數為支。然後按幹支順序,求公元後年幹支以辛酉為起點順推,求公元前年幹支以庚申為起點逆推。若干支數為零,求公元後年幹支,取辛酉的前一個幹支;求公元前年幹支,則取辛酉即可。