杂记 › 生活随笔 › 天干地支纪年怎么算?生肖与干支日的对应

天干地支纪年怎么算?生肖与干支日的对应

去年替公司给客户寄新年贺卡,我在落款写了"丙午马年大吉"。一位客户回了一句很客气的话:"我们这边蛇年还没过完呢。"我当时以为是他记错了。真正让我改习惯的是另一件事:亲戚家的孩子生在 2 月 10 日,家里老人一口咬定属蛇,而产房发的纪念手环上,年份已经翻到马。

后来我把干支的算法自己推了一遍,才发现这两件事不是谁记错,而是"哪一天算换年"这件事本来就有两套人在用。下面这些数我是逐个取模算过的。

为什么是六十,而不是一百二十

十天干:甲乙丙丁戊己庚辛壬癸,十二地支:子丑寅卯辰巳午未申酉戌亥。把它们直接两两相乘是 120 种,但实际只有 60 种能出现,因为干的序号和支的序号必须同为阳或同为阴(甲只能配子寅辰午申戌,乙只能配丑卯巳未酉亥)。我拿两层循环数过一遍:120 个配对里同阴阳的正好 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 干支 生肖 六十甲子序号
189406甲午马31
190060庚子鼠37
1911711辛亥猪48
194951己丑牛26
198400甲子鼠1
200064庚辰龙17
202404甲辰龙41
202515乙巳蛇42
202626丙午马43
202737丁未羊44

这里有两处专出错的边角。第一处是余数为 0:1900 年(年-4)mod 12 得 0,下标 0 是"子",而(年-4)mod 10 得 6,下标 6 是"庚",合起来是庚子年,庚子事变就叫这名;1984 年两个余数都是 0,正好是六十甲子的第一位甲子。第二处是年份小于 4 时取模会出负数,必须先加一圈再取模,即(余数+10)再 mod 10,我在浏览器里试老物件的年份时就撞过这个。

要查具体的日子我不再手推,用 天干地支计算器:输入公历日期,它把年柱、月柱、日柱、时柱四柱一起给,附带生肖,还会把取模过程写出来,方便我对着自己的草稿看是哪一步偏了。

生肖和干支年对不上,是因为有两个"新年"

关键在于分界日。民俗和历书按正月初一(也就是春节)换年;命理和八字按立春换年,而立春在公历 2 月 3 日到 5 日之间浮动。春节在公历上的落点却能在 1 月下旬与 2 月中旬之间来回挪——我手上那份 2024 到 2030 年的表里,最早的春节是 1 月 26 日,最晚的是 2 月 17 日,相差 22 天。于是两个"新年"之间总会有一段窗口期,同一日期在两种口径下分属两年。

亲戚家孩子那个 2 月 10 日就落在窗口里。2026 年的春节是 2 月 17 日,立春在 2 月初,所以 2 月 10 日这天:按立春口径已经是丙午年、属马;按春节口径还在乙巳年、属蛇。两边都没算错。反方向的窗口也存在:有一年春节在 1 月 22 日、立春要到 2 月 4 日,那么 1 月 28 日出生的人,按春节口径是癸卯属兔,按立春口径仍是壬寅属虎——这一年"早出生十几天差一个属相"。

所以我的选择变成看用途:写拜年话、做生肖营销、跟长辈说属相,走春节口径;排四柱、看黄历里的年柱,走立春口径。上面那个工具用的是立春分界,它在 2 月 4 日之前的日期会取上一年,我算窗口期内的日子时会特意注意这条。

还有一件前置工作比公式更容易出错:先确认那一天到底落在哪个公历日期上。跨时区出生的、只记得农历生辰的,我先把日期本身定下来再谈干支,比如用 世界时间 核对出生地当天的日期,或者用 时间戳转换 把一个日期换成日序数,免得自己数的天数差一天。

干支纪日是另一条独立的轴

这点特别容易被忽略:纪年六年一循环、纪月跟着节气走、纪日是连续六十天不停的一圈,它不跟月初、不跟年节、也不跟任何节日对齐。所以同一个人年柱和日柱之间没有任何推导关系,四柱是四条各自独立推进的序列——月干由年干起(俗称五虎遁),时干由日干起(五鼠遁),日柱本身只能靠一个锚点日期推。

正因为靠锚点,纪日对"起点差一天"极其敏感:锚点定错,整条序列就整体平移一位,而结果看上去仍然像一个合法的干支。我能验证的是循环本身:60 的整数倍必然同柱,2026 年 10 月 15 日到 2026 年 12 月 14 日正好 60 天,这两天日柱相同;上面那份表里,从 1900 年 1 月 31 日到 2024 年 2 月 10 日相隔 45300 天,除以 60 得 755 整轮,也必然同柱。那个工具内置的锚点就是把 1900 年 1 月 31 日记为甲戌日、六十甲子第 11 位。

Q:本命年到底按春节还是按立春算?

看你用在哪。民俗意义上的"过本命年"从正月初一起算;命理、八字里的年柱从立春起算。两种口径的差别只在 1 月下旬到 2 月中旬那段窗口,其他日期两种数法给出的结果一样。

Q:为什么网上的干支日和黄历上写的不一样?

因为锚点和日界不同。六十甲子循环本身是确定的,各家工具的起点日期、以及把子时算在哪一天,规则未必一致,差一两天就会体现成干支差一二位。核对时先看它给的锚点或示例日期,别只比结果。

Q:生肖是十二个,干支年有六十个,怎么对应?

生肖只跟着地支走,地支 12 年一圈;干支年要把干和支同时对齐,60 年才一圈。所以同一个属相对应五个不同的干支年,1984、1996、2008、2020、2032 都属鼠,分别是甲子、丙子、戊子、庚子、壬子。

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

不能。年柱可以用年份的线性偏移,月要按节气切,日只能靠日序数取模。这三条轴的起点各不相同,套同一个公式一定会错。

Q:卡片落款我该写哪个?

写客户看得懂的那个:拜年场景写"蛇年"或"马年"这种属相话,比写"丙午"更安全,因为多数人是按春节记属相的。要写干支就避开窗口期,或者干脆只写公历年份。

那张贺卡的落款我最后改成了两种:发给国内客户的是属相说法配公历年份,另一批发给做传统行业、讲究择日的合作方,则按立春口径写干支。判断依据现在就一句话——问的人按哪个日子换年,我就按那个日子算,而不是去争哪个才是"正统"。

📎 相关文章

分数加减法通分总出错?把过程一步步看明白 2026-10-15 距离过年还有多少天?节日倒数的日期怎么算 2026-10-15 选人组队到底多少种?排列与组合别再搞混 2026-10-15 过年叫不出亲戚称呼?"爸爸的姐姐的儿子"到底叫啥 2026-10-15 一天到底消耗多少卡路里?算算你的基础代谢BMR 2026-10-15