本文拆解这套算法的完整流程:从一个生日出发,逐步得到九宫格的各项数字。全过程只涉及整数运算与查表,其中农历换算依赖既有数据表(见附录 B)。
全文以公历 2026-10-04 · 子时为主线,各节依次演算,最终结果与 九宫格 · 在线测算 一致。
九宫格 · 在线测算输入公历生日与时辰,立刻得到本文这套算法的结果。 九宫格 · 时历查看当天的黄历宜忌、子午流注当令经络与灵龟八法。
整套算法只包含三类运算:拆分、相加、拼接。
其中最容易出错的是第五节的"体串",该节对两种分支分别说明,并附对照表。
整套算法共十步。前八步依次计算,每一步都用上一步的结果;最后两步为汇总与查表。
第 1 到第 8 步,阳格串、阴格串各做一遍,因此一张盘会得到阳格、阴格两组结果。
十格宫位的排法是固定的。下面是本例(公历 2026-10-04 · 子时 · 阳格①)的实际盘面:

- 盘中的 10 个大数字是宫位号:1 到 9,加上底部居中的 0。
- 1 到 9 排成三行:第一行 1、4、7,第二行 2、5、8,第三行 3、6、9;0 单独摆在第四行中间。
- 顶上左边是缺,右边是半补。
- 底下三行是主魂、辅魂、魄。
- 每个格子里的符号含义见下表:
| 小符号 | 读作 | 出现规则 |
|---|
| ○ 圆圈 | 魄 | 这个数字在日期串里出现过几次,就画几个圈 |
| ▲ 三角 | 辅魂 | 这个数字在辅魂串里出现过几次,就画几个三角 |
| ■ 方块 | 主魂 | 这个数字在主魂串里出现过,就画一个(只画一个) |
| ★ 星星 | 缺 | 这个数字在日期串、辅魂串、主魂串里一次都没出现 |
注意:盘底"魄:01246"表示"出现过的数字"(去重后从小到大);格子里的 ○ 表示"出现的次数"。两者含义不同,不要混淆。格子底色为固定配色(白 / 绿 / 黄 / 红 / 紫),不随主题变化。
| 输入项 | 说明 |
|---|
| 公历生日 | 年月日,例:2026-10-04,决定阳格 |
| 出生时辰 | 12 个时辰中选一个,只决定半补;选子时还会多算两格 |
| 出生地(可选) | 填写后会把钟表时间换算为当地真太阳时,再据此定时辰,见附录 A |
关于半补,先说明两点,以免与"缺"混淆:
- 半补只与时辰有关,与生日无关。12 个时辰各有对应的半补,第十节有完整对照表。
- 每个时辰都有半补,不存在"不需要半补"的时辰;可能为空的是缺,不是半补。
有两个特殊情况需要先说明:
本例:公历 2026-10-04、子时,当天和第二天都要算,共四格;农历为八月廿四,不在闰月,因此没有前置的 1。
规则如下:阳格用公历,阴格用农历。把年月日拼成 8 位数字,月份和日子不足两位的前面补 0。
阳格:公历 2026-10-04 → 20261004
这里的 2026 是农历的年,08 是农历的月,24 是农历的日子。
本例:阳格日期串 20261004,阴格日期串 20260824。
有两点需要注意:
- 年初出生的人,农历年可能比公历年份小 1。例如公历 1 月出生,农历可能仍属上一年的腊月。
- 8 位串中不包含闰月信息。闰六月与六月拼出的数字完全相同(闰六月初一和六月初一都是
20250601),闰月由第七节"前面补 1"的规则区分。
这一步分三小步:
总和 = 年的数位和 + 月的数位和 + 日的数位和
总和如果超过一位,就把它各位再加一次;一直加到只剩一位为止。
本例(列出每一步中间值):
小结:总和是"年月日相加",数根是"总和再压缩为一位"。
这是全文最容易出错的一步。体串只由总和决定,分两种情况。
体串 = 年的数位和、月的数位和、日的数位和,三个数直接连起来写。
特例:如果总和正好等于 10,连完以后,末尾再多写一个 "10"。
(总和不超过 10 时,这三个数都是一位数,直接相连不会产生歧义。)
再把 总和的各位相加。如果结果还是两位数,也写下来;
写下来的这些数按顺序连起来,就是体串。(最后那个一位数不写。)
本例(两个总和都大于 10):
阳格:总和 15 → 写 15;1+5 = 6,一位数,停 → 体串 "15"
阴格:总和 24 → 写 24;2+4 = 6,一位数,停 → 体串 "24"
| 总和 | 走哪条 | 写法 | 体串 |
|---|
| 6 | A | 2、2、2 连起来 | 222 |
| 8 | A | 4、2、2 连起来 | 422 |
| 10 | A 的特例 | 2、1、7 连起来,末尾再补一个 10 | 21710 |
| 12 | B | 写 12;1+2=3 停 | 12 |
| 15 | B | 写 15;1+5=6 停 | 15 |
| 24 | B | 写 24;2+4=6 停 | 24 |
| 34 | B | 写 34;3+4=7 停 | 34 |
| 47 | B | 写 47;4+7=11,还是两位数,再写 11;1+1=2 停 | 4711 |
| 48 | B | 写 48;4+8=12,再写 12;1+2=3 停 | 4812 |
升位:统计一串数字中 0 到 9 各出现几次。每满 3 个,就写出一个该数字;不满 3 个的不写。最后按 0、1、2、…、9 的顺序拼接。
规则可概括为"三个换一个":
- 出现 1 次、2 次 → 不写
- 出现 3 次、4 次、5 次 → 写 1 个
- 出现 6 次、7 次、8 次 → 写 2 个
- 出现 9 次 → 写 3 个
本例(先对日期串计数):
升两位的例子:
20111111 里,1 出现了 6 次 → 6 除以 3 等于 2 → 升位 = "11"
这里的"升位"作用于日期串。计算主魂时还需对辅魂串再升一次位,方法相同。
闰月特例:阴格落在闰月里时,最前面再补一个 "1"
阳格:升位 "0" 接上 体串 "15" → 辅魂串 "015"
阴格:升位 "2" 接上 体串 "24" → 辅魂串 "224"
盘面上的 ○ 标记来自"升位(日期串)":某个数字在日期串中出现几次,就画几个圈。
闰月的例外情形(见案例三):
阴格日期串 20250601 → 升位 "0",体串 "16"
因为落在闰月,最前面补 1 → 辅魂串 "1016"
升位("015") → 0、1、5 各出现 1 次,都不满 3 → 空
幸运数 = 辅魂串 "015" + 主魂 "6" = "0156"
升位("224") → 2 出现 2 次,不满 3 → 空
幸运数 = "224" + "6" = "2246"
幸运数即盘面顶部显示的那串数字。本例阳格幸运数为 0156,阴格为 2246。
这一步(第 9 步)要用到前面算出的三条串:日期串、辅魂串、主魂。
逐个检查 0 到 9:只要它在日期串、辅魂串、主魂这三条串中出现过,就不算缺;三条串中都没出现才算缺。把缺的数字从小到大连起来。
阳格:日期串 20261004、辅魂串 015、主魂 6
三条里都没出现过的:3、7、8、9 → 缺 = "3789"
(5 不在日期串里,但辅魂串 "015" 里有它,所以 5 不算缺)
阴格:日期串 20260824、辅魂串 224、主魂 6
三条里都没出现过的:1、3、5、7、9 → 缺 = "13579"
如果 0 到 9 被这三条串全部覆盖,即为"无缺"。
例如:公历 1953-06-28 丑时,日期串 19530628、辅魂串 34、主魂 7,0 到 9 全部出现 → 缺为空;但半补仍然存在(丑时为 789)。
半补只与时辰有关,与生日无关:
| 时辰 | 半补数字 | 五行 |
|---|
| 子时 (23:00–00:59) | 06 | 水 |
| 丑时 (01:00–02:59) | 789 | 土 |
| 寅时 (03:00–04:59) | 45 | 木 |
| 卯时 (05:00–06:59) | 45 | 木 |
| 辰时 (07:00–08:59) | 789 | 土 |
| 巳时 (09:00–10:59) | 3 | 火 |
| 午时 (11:00–12:59) | 3 | 火 |
| 未时 (13:00–14:59) | 789 | 土 |
| 申时 (15:00–16:59) | 12 | 金 |
| 酉时 (17:00–18:59) | 12 | 金 |
| 戌时 (19:00–20:59) | 789 | 土 |
| 亥时 (21:00–22:59) | 06 | 水 |
重申:12 个时辰都有半补;半补与缺是两回事——缺由计算得出(第九节),半补由时辰查表得出。
下面五个案例覆盖各类特殊情况,每一步都列出中间值,可逐行核对。
| 案例 | 公历日期 | 时辰 | 特殊在哪 |
|---|
| 一 | 2000-11-11 | 午时 | 最常见的情况;总和正好 10,还有两个数字同时升位 |
| 二 | 2026-10-04 | 子时 | 本文主线;子时出四格 |
| 三 | 2025-07-25 | 午时 | 农历闰月,阴格辅魂串前面补 1 |
| 四 | 2011-11-11 | 午时 | 一个数字出现 6 次,升位升两位 |
| 五 | 1999-09-29 | 午时 | 总和较大,体串需降两次 |
非子时、非闰月,只出两格。本例恰好涉及两个边界情况:总和正好等于 10,且有两个数字同时升位。
公历 2000-11-11(农历 十月十六)· 午时
② 数位和:年 2+0+0+0=2,月 1+1=2,日 1+1=2
③ 体串:总和 6 ≤ 10 → "2"+"2"+"2" = "222"
④ 升位:0 出现 3 次 → 写 1 个 "0";1 出现 4 次 → 写 1 个 "1"
⑤ 辅魂串: "01" + "222" = "01222"
⑥ 主魂:数根 6 + 升位("01222"),"2" 出现 3 次 → "2" → 主魂 "62"
⑦ 幸运数: "01222" + "62" = "0122262"
⑧ 缺:三条串盖住 0、1、2、6 → 缺 "345789"
结果汇总
| 格 | 幸运数 | 辅魂 | 主魂 | 魄 | 缺 | 半补 |
|---|
| 阳格 | 0122262 | 01222 | 62 | 012 | 345789 | 3 |
| 阴格 | 0217101 | 021710 | 1 | 0126 | 34589 | 3 |
(魄:该格日期串里出现过的数字,去重后从小到大。)
全文沿用的主线例子。子时出四格:当天两格加次日两格。
② 数位和:年 2+0+2+6=10,月 1+0=1,日 0+4=4
总和 = 10+1+4 = 15,数根 = 1+5 = 6
③ 体串:总和 15 > 10 → 写 15;1+5=6 停 → "15"
④ 升位:0 出现 3 次 → 写 1 个 "0"
⑤ 辅魂串: "0" + "15" = "015"
⑥ 主魂:数根 6 + 升位("015")=空 → "6"
⑦ 幸运数: "015" + "6" = "0156"
⑧ 缺:三条串盖住 0、1、2、4、5、6 → 缺 "3789"
② 数位和:年 10,月 0+8=8,日 2+4=6
总和 = 10+8+6 = 24,数根 = 2+4 = 6
次日两格规则相同,只是日期换成第二天:
总和 = 10+1+5 = 16,数根 = 1+6 = 7
③ 体串:总和 16 > 10 → 写 16;1+6=7 停 → "16"
④ 升位:0 出现 3 次 → 写 1 个 "0"
⑤ 辅魂串: "0" + "16" = "016"
⑥ 主魂:数根 7 + 升位("016")=空 → "7"
⑦ 幸运数: "016" + "7" = "0167"
⑧ 缺:三条串盖住 0、1、2、5、6、7 → 缺 "3489"
结果汇总
| 格 | 幸运数 | 辅魂 | 主魂 | 魄 | 缺 | 半补 |
|---|
| 阳格①(当天) | 0156 | 015 | 6 | 01246 | 3789 | 06 |
| 阴格①(当天) | 2246 | 224 | 6 | 02468 | 13579 | 06 |
| 阳格②(次日) | 0167 | 016 | 7 | 01256 | 3489 | 06 |
| 阴格②(次日) | 2257 | 225 | 7 | 02568 | 1349 | 06 |
其中阳格① 0156、阴格① 2246 与线上测算一致。
本例为农历闰六月初一,落在闰月内。规则:阴格的辅魂串最前面补一个 1(阳格不受影响)。
公历 2025-07-25(农历 闰六月初一)· 午时
② 数位和:年 2+0+2+5=9,月 0+7=7,日 2+5=7
总和 = 9+7+7 = 23,数根 = 2+3 = 5
③ 体串:总和 23 > 10 → 写 23;2+3=5 停 → "23"
④ 升位:2 出现 3 次 → 写 1 个 "2"
⑤ 辅魂串: "2" + "23" = "223"
⑥ 主魂:数根 5 + 升位("223")=空 → "5"
⑦ 幸运数: "223" + "5" = "2235"
⑧ 缺:三条串盖住 0、2、3、5、7 → 缺 "14689"
② 数位和:年 9,月 0+6=6,日 0+1=1
结果汇总
| 格 | 幸运数 | 辅魂 | 主魂 | 魄 | 缺 | 半补 |
|---|
| 阳格 | 2235 | 223 | 5 | 0257 | 14689 | 3 |
| 阴格(闰月) | 10167 | 1016 | 7 | 01256 | 3489 | 3 |
升位的规则是"每满 3 个升 1 位",因此一个数字出现 6 次时会一次升出两位。
公历 2011-11-11(农历 十月十六)· 午时
① 日期串:20111111(1 一共出现 6 次)
② 数位和:年 2+0+1+1=4,月 1+1=2,日 1+1=2
③ 体串:总和 8 ≤ 10 → "4"+"2"+"2" = "422"
④ 升位:1 出现 6 次 → 写 2 个 "1"
⑤ 辅魂串: "11" + "422" = "11422"
⑥ 主魂:数根 8 + 升位("11422"),1 和 2 各 2 次,都不满 3 → 空 → "8"
⑦ 幸运数: "11422" + "8" = "114228"
⑧ 缺:三条串盖住 0、1、2、4、8 → 缺 "35679"
结果汇总
| 格 | 幸运数 | 辅魂 | 主魂 | 魄 | 缺 | 半补 |
|---|
| 阳格 | 114228 | 11422 | 8 | 012 | 35679 | 3 |
| 阴格 | 1123 | 112 | 3 | 0126 | 45789 | 3 |
本案例对应第五节最容易出错的情况:总和一次降不到一位,需要降两次。
公历 1999-09-29(农历 八月二十)· 午时
② 数位和:年 1+9+9+9=28,月 0+9=9,日 2+9=11
总和 = 28+9+11 = 48,数根 = 48 → 4+8 = 12 → 1+2 = 3
③ 体串:总和 48 > 10 → 写 48;4+8=12,还是两位数,再写 12;1+2=3 停 → "4812"
④ 升位:9 出现 5 次 → 写 1 个 "9"
⑤ 辅魂串: "9" + "4812" = "94812"
⑥ 主魂:数根 3 + 升位("94812")=空 → "3"
⑦ 幸运数: "94812" + "3" = "948123"
⑧ 缺:三条串盖住 0、1、2、3、4、8、9 → 缺 "567"
结果汇总
| 格 | 幸运数 | 辅魂 | 主魂 | 魄 | 缺 | 半补 |
|---|
| 阳格 | 948123 | 94812 | 3 | 0129 | 567 | 3 |
| 阴格 | 938112 | 93811 | 2 | 01289 | 4567 | 3 |
出生地不同,钟表时间与当地"真太阳时"会有差异。算法用下面的式子换算:
真太阳时 = 北京时间 + (经度 − 120) × 4 分钟 + 均时差
第几天 = 当天是当年的第几天(1 月 1 日 = 1)
参数 = 2π × (第几天 − 81) ÷ 364
均时差 = 9.87 × 正弦(2 × 参数) − 7.53 × 余弦(参数) − 1.5 × 正弦(参数)
算出的真太阳时,再按子时从 23:00 起的规则,对照第十节的时辰表换算成 12 时辰,后续步骤不变。
- 页面:线上测算与时历
- 数据:农历换算与黄历数据来自既有数据表(农历库覆盖 1900 到 2100 年),机械迁移后逐字段与原版对拍;测算核心为纯整数运算,输入相同则输出相同
- 时间基准:所有与当前时间有关的计算,统一按东八区
| 名词 | 含义 |
|---|
| 日期串 | 年月日拼成的 8 位数,例:公历 2026-10-04 → 20261004 |
| 数位和 | 把一个数的每一位拆开相加:2026 → 2+0+2+6 = 10 |
| 总和 | 年的数位和 + 月的数位和 + 日的数位和 |
| 数根 | 总和一直做数位和,直到只剩一位(1 到 9) |
| 升位 | 一串数里,哪个数字每满 3 个,就写一个它自己 |
| 体串 | 由总和决定的一条串,详见第五节 |
| 辅魂串 | 升位(日期串) 接上 体串(闰月阴格最前面再加个 1) |
| 主魂 | 数根 接上 升位(辅魂串) |
| 幸运数 | 辅魂串 接上 主魂 |
| 缺 | 0 到 9 里,日期串、辅魂串、主魂三条都没出现过的数字 |
| 半补 | 只看出生时辰,查第十节的表 |