雜記 › 生活隨筆 › 天干地支紀年怎麼算?生肖與干支日的對應

天干地支紀年怎麼算?生肖與干支日的對應

今年年初替公司給客戶寄新年賀卡,落款我寫了「丙午馬年大吉」,寄出的日子還在 2 月上旬。一位客戶回得很客氣:「我們這邊蛇年還沒過完呢。」我一度以為是他記錯。真正讓我改習慣的是另一件事:親戚家孩子生在 2 月 10 日,家裡老人一口咬定屬蛇,產房發的紀念手環上,年份已經翻到馬。

後來我把干支的算法自己推了一遍,才發現這兩件事不是誰記錯,而是「哪一天算換年」本來就有兩套人在用:2026 年的正月初一是 2 月 17 日,丙午年從那天起算。下面這些數我是逐個取模算過的。

為什麼是六十,而不是一百二十

十天干:甲乙丙丁戊己庚辛壬癸,十二地支:子丑寅卯辰巳午未申酉戌亥。把它們直接兩兩相乘是 120 種,但實際只有 60 種能出現,因為干的序號和支的序號必須同為陽或同為陰(甲只能配子寅辰午申戌,乙只能配丑卯巳未酉亥)。我拿兩層迴圈數過:同陰陽的正好 60 個。

另一條路是求公倍數:干每 10 年轉一圈、支每 12 年轉一圈,要兩個同時回到起點得走 lcm(10,12)=60 步。所以「六十甲子」不是湊出來的吉利數,是 10 和 12 的循環週期決定的:干支紀年六十年一循環,生肖只跟著地支走,十二年一輪迴。1984 年是甲子,下一個甲子就是 2044 年。

年份取模:兩種寫法,同一個結果

最常見的是從 0 開始數:干序號 =(年份-4)mod 10,支序號 =(年份-4)mod 12,0 對應甲和子。也有資料寫成(年份-3),那是從 1 開始數,餘數 0 要歸到第 10 個干(癸)和第 12 個支(亥)。兩條式子答案完全相同,差別只在數法;我一開始把兩套下標混著用,算出來的年份全錯一位。

公曆年 (年-4)mod 10 (年-4)mod 12 干支 生肖 六十甲子序號
190060庚子鼠37
194951己丑牛26
198400甲子鼠1
202404甲辰龍41
202515乙巳蛇42
202626丙午馬43
202737丁未羊44

這裡有兩處專出錯的邊角。第一處是餘數為 0:1900 年(年-4)mod 12 得 0,下標 0 是「子」,(年-4)mod 10 得 6,下標 6 是「庚」,合起來是庚子年;1984 年兩個餘數都是 0,正好是六十甲子第一位甲子。第二處是負數取模:JS 的 % 運算子在被除數為負時返回負餘數,所以算公元 4 年以前的年份,(年份-4)先得到負數,要寫成(餘數+10)再 mod 10 才能落回 0 到 9。這一步只是演算法層面的防禦,1900 年以後(年份-4)恆為正,取模不可能出負數。

要查具體日子我不再手推,用 天干地支計算器:輸入公曆日期,年柱、月柱、日柱、時柱四柱一起給,附帶生肖,還把取模過程寫出來,方便我對草稿看哪一步偏了。

生肖和干支年對不上,是因為有兩個「新年」

關鍵在於分界日。民俗和曆書按正月初一(也就是春節)換年,國家標準 GB/T 33661-2017《農曆的編算和頒行》也是從正月初一算新年;命理和八字按立春換年,立春在公曆 2 月 3 日到 5 日之間浮動。春節的落點卻能在 1 月下旬到 2 月中旬之間來回挪——我那份 2024 到 2030 年的表裡,最早 1 月 26 日,最晚 2 月 17 日,相差 22 天。於是兩個「新年」之間總有一段窗口期,同一日期在兩種口徑下分屬兩年。

親戚家孩子那個 2 月 10 日就落在窗口裡:2026 年立春在 2 月上旬、春節要到 2 月 17 日,所以按立春口徑已是丙午年、屬馬,按春節口徑還在乙巳年、屬蛇,兩邊都沒算錯。反方向的窗口也有:2023 年春節 1 月 22 日、立春要到 2 月 4 日,1 月 28 日出生的人按春節口徑是癸卯屬兔,按立春口徑仍是壬寅屬虎——早出生十幾天就差一個屬相。

所以我的選擇是看用途:寫拜年話、跟長輩說屬相走春節口徑,排四柱、看年柱走立春口徑。有個近似要拎出來:立春並不總在 2 月 4 日,2025 年是 2 月 3 日 22:10。按「2 月 4 日之前都算上一年」整切,多數年份沒事;但碰上 2025 年這種交節在 2 月 3 日深夜的,22:10 到 24 點之間出生的人就被歸到上一個年柱,差的是不到兩小時。要精確到某一天,得按當年立春的實際時刻定,別信寫死的 2 月 4 日。

還有一件前置工作比公式更容易出錯:先確認那一天到底落在哪個公曆日期上。跨時區出生的、只記得農曆生辰的,我先把日期定下來再談干支,比如用 世界時間 核對出生地當天的日期,或用 時間戳轉換 把日期換成日序數,免得自己數的天數差一天。

干支紀日是另一條獨立的軸

這點特別容易被忽略:紀年六十年一循環、生肖十二年一圈、紀月跟著節氣走、紀日是連續六十天不停的一圈,不跟月初、年節、節日對齊。所以同一個人的年柱和日柱之間沒有推導關係,四柱是四條各自獨立推進的序列——月干由年干起(五虎遁),時干由日干起(五鼠遁),日柱只能靠錨點日期推。

正因為靠錨點,紀日對「起點差一天」極其敏感:錨點定錯,整條序列就整體平移一位,結果看上去仍然像一個合法的干支。我能驗證的是循環本身:60 的整數倍必然同柱,2026 年 10 月 15 日到 2026 年 12 月 14 日正好 60 天,這兩天日柱相同;1900 年 1 月 31 日到 2024 年 2 月 10 日相隔 45300 天,45300 除以 60 得 755 整輪,也必然同柱。

錨點這塊我自己串過行,正確值寫在這兒:1900 年 1 月 1 日是甲戌日、六十甲子第 11 位;1900 年 1 月 31 日不是甲戌,是甲辰日、第 41 位,上面那組 45300 天兩端同為甲辰,正好印證。另兩個我逐個核過的是 1949 年 10 月 1 日甲子日(第 1 位)、2026 年 10 月 15 日壬戌日(第 59 位)。通式拿儒略日數寫最省事:(JDN+49) mod 60,餘數 0 是甲子;這三個點的餘數應是 10、0、58,差 1 就整條平移 1 位。

Q:本命年到底按春節還是按立春算?

看你用在哪。民俗的「過本命年」從正月初一起算,命理、八字的年柱從立春起算。差別只在 1 月下旬到 2 月中旬那段窗口,其他日期兩種數法結果一樣。

Q:為什麼網上的干支日和黃曆上寫的不一樣?

因為錨點和日界不同。循環本身是確定的,各家用的起點日期、把子時算在哪一天未必一致,差一兩天就體現成干支差一二位。核對時先看它給的錨點或示例日期,別只比結果。

Q:生肖是十二個,干支年有六十個,怎麼對應?

生肖只跟著地支,12 年一圈;干支年要把干和支同時對齊,60 年才一圈。所以一個屬相對應五個干支年,1984、1996、2008、2020、2032 都屬鼠,分別是甲子、丙子、戊子、庚子、壬子。

Q:能不能用(年份-4)mod 10 去算日和月?

不能。年柱可以用年份的線性偏移,月要按節氣切,日只能靠日序數取模。這三條軸的起點各不相同,套同一個公式一定會錯。

那張賀卡的落款我最後改成了兩種:給國內客戶的寫屬相配公曆年份,給講究擇日的合作方按立春口徑寫干支——問的人按哪個日子換年,我就按哪個日子算。

📎 相關文章

照片轉了 90°,換一部裝置方向又回來了:EXIF 標記與真實旋轉的分工 2026-10-22 每月同一天和每 28 天一次,一年差出 29 天 2026-10-22 用隨機比較器打亂名單,抽籤就已經不公平了 2026-10-21 加侖有兩種、馬力有兩種、位元組有兩套進位:換算前先問是哪一種 2026-10-21 2 月 29 日出生的人,平年哪天滿 18 歲?兩種週年口徑差一天 2026-10-21