TianEon
学堂

八字排盘准不准?十个历法库与 NASA JPL 星历逐秒对照

更新于 2026年10月21日

同一个生辰,在两个免费的八字排盘网站上可能排出两张不同的命盘。通常两边都没“算错”,而是在某个分界点上取法不同。在做自己的排盘之前,我们想弄清楚:到底是哪些分界点、差多少、天象支持哪一个答案。于是我们把大多数排盘工具所依赖的历法库,拿来和天文星历逐一对照。本文公开这些结果。

方法

年柱和月柱在十二个“节”交接,也就是太阳到达黄经 15° 整数倍的时刻(立春为 315°)。这是一个有唯一正确时刻的天文事件,所以可以验证。

  • 基准: 使用 skyfield 1.55 加 NASA JPL DE421 星历计算太阳视黄经,二分法求解到秒。
  • 独立的库: astronomy-engine 2.1.19、ephem 4.2.1、sxtwl 2.0.7(寿星)、cnlunar 0.2.5、lunisolar 2.6.0、k-saju 0.1.4。
  • 寿星一系: lunar-javascript 1.7.7(6tail),以及与它同源的 tyme4ts、lunaris、lunar_python。它们算法相同,不能算作对它的独立验证。

下文时间均为北京时间(UTC+8),即中国历书的通行标准。

立春,精确到秒

年份JPL DE421lunar-javascriptsxtwlastronomy-engineephem
197602-05 00:39:2600:39:2800:39:2700:39:1100:39:22
198402-04 23:18:4423:18:4423:18:4423:18:4223:18:38
199002-04 10:13:5910:14:0010:14:0010:13:5810:13:55
200002-04 20:40:2220:40:2420:40:2420:40:1820:40:13
202402-04 16:27:0716:27:0716:26:5316:26:4916:26:56
202702-04 09:46:1809:46:1809:45:5909:46:2409:46:02

在我们测试的十个节气上,lunar-javascript 与 DE421 的差距都在 2 秒以内;它对 2024 年地球自转减慢(ΔT)的修正为 69.17 秒,国际地球自转服务(IERS)公布的值是 69.18 秒。其他库最多偏差约 20 秒,主要是 ΔT 的估算不同:astronomy-engine 对 2024 年取 73.9 秒,于是它的立春早了约 18 秒。

二十秒听上去无关紧要,对绝大多数人也确实如此。只有恰好出生在这个窗口里的人会受影响,而那时它决定的是年柱和生肖。

四柱真正分歧在哪里

秒级误差很少是问题。比较完整的四柱时,所有分歧都来自以下三个原因之一。

生辰(北京时间)DE421 推得的四柱谁不同,为什么
2000-01-01 00:30己卯 丙子 戊午 壬子无分歧
1990-02-04 10:00己巳 丁丑 庚子 辛巳sxtwl、cnlunar、lunisolar 给出 庚午 戊寅:它们按立春当天换年,而不是按立春时刻(10:13:59)
1984-02-04 23:30甲子 丙寅 己巳 甲子按“晚子时不换日”的取法,日柱仍为 戊辰
2027-02-04 09:40丙午 辛丑 甲寅 己巳按日换节的库给出 丁未 壬寅,而此刻比真正的立春早六分钟
2024-02-04 16:27:00癸卯 乙丑 戊戌 庚申k-saju 与 astronomy-engine 给出 甲辰:它们的立春早了约 18 秒

一、把节气当成一天,而不是一个时刻

有些库在“节”的那一天就换年、换月。凡是在当天、但在交节时刻之前出生的人,都会拿到下一年或下一个月的柱。一年有十二个交节日,每个都有这个风险,所以这是排错命盘最常见的原因。这里差的是几个小时,而不是几秒。

二、晚子时(23:00–24:00)

23 点到午夜之间出生,算第二天(子初换日),还是仍算当天、取“晚子时”(早晚子时),传统上本来就有两派。两种都不是错误,但排盘工具应当说明自己用的是哪一种。lunar-javascript 默认不换日,各个库的默认值并不相同。

三、ΔT 的几秒钟

最少见的情况:出生时刻离交节不到二十秒左右。只有星历级的 ΔT 才能定夺。

八字之外:紫微斗数与六爻

同样的方法在其他术数里也发现了问题。

  • 紫微斗数。 iztro 2.6.2 是最完整的开源紫微库。在 1,800 张命盘上,它与两个独立的库(fortel-ziweidoushu 和 ziwei-lite)在命宫、身宫、五行局和十四主星上完全一致;它的历法在 1900 至 2100 年的全部 73,384 天上都与 lunar-javascript 相同。但对农历月末的晚子时出生,它只进日、不进月:我们试的 24 张这类命盘中有 22 张是错的(例如 1996-08-13 23 点多)。基于它的排盘工具应当避开这条输入路径。
  • 六爻(纳甲)。 我们用 1,920 个案例(64 卦 × 10 个日干 × 3 种动爻)测试了九个 npm 包,参照答案只由古籍表格推出。三个包在结构上全部吻合,但其中一个自带的节气计算早 5 分钟到晚 7 分钟不等。另有两个只提供部分数据;其余的或把卦放错了宫,或把卦名写错,或按日换节,或需要调用付费的远程接口。没有一个会按所问之事选取用神。

如果你在用排盘工具

  • 出生在交节日前后一天? 大致是公历每月的第一周,见二十四节气。确认你的工具用的是精确时刻:把出生时间前后各调一小时,年柱或月柱应当在正确的分钟翻转,而不是在午夜。
  • 出生在 23 点到午夜之间? 弄清工具采用哪种子时规则,再决定你自己从哪一派。
  • 出生地远离时区基准经线,或当时实行夏令时? 时柱,有时连日柱,都取决于真太阳时。

天时录怎样处理

我们的八字排盘用 lunar-javascript 把出生时刻与每个“节”的时刻逐秒比较,它的节气在全部测试中都与 DE421 吻合。晚子时规则是一个明确的选项(默认换日,也可以选不换日),命盘会列出所做的真太阳时修正。紫微斗数的封装从不走 iztro 有问题的晚子时路径;六爻引擎则依古籍表格自行编写,测试中与两个独立的库在 10,240 和 7,680 个生成案例上对照,没有一处不同。上面这些案例都保留为回归测试,库升级只要改变其中任何一个,构建就会失败。

撰写解读的 AI 拿到的是已经算好的命盘,无权改动。历法是算术,只有文字由模型来写。

引用本文

欢迎引用或链接本页。如果你维护排盘工具或历法库,想要完整的案例清单,或者认为我们某个案例有误,请联系我们。