八字排盤準不準?十個曆法函式庫與 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 DE421 | lunar-javascript | sxtwl | astronomy-engine | ephem |
|---|---|---|---|---|---|
| 1976 | 02-05 00:39:26 | 00:39:28 | 00:39:27 | 00:39:11 | 00:39:22 |
| 1984 | 02-04 23:18:44 | 23:18:44 | 23:18:44 | 23:18:42 | 23:18:38 |
| 1990 | 02-04 10:13:59 | 10:14:00 | 10:14:00 | 10:13:58 | 10:13:55 |
| 2000 | 02-04 20:40:22 | 20:40:24 | 20:40:24 | 20:40:18 | 20:40:13 |
| 2024 | 02-04 16:27:07 | 16:27:07 | 16:26:53 | 16:26:49 | 16:26:56 |
| 2027 | 02-04 09:46:18 | 09:46:18 | 09:45:59 | 09:46:24 | 09: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 分鐘不等。另有兩個只提供部分資料;其餘的或把卦放錯了宮,或把卦名寫錯,或按日換節,或需要呼叫付費的遠端 API。沒有一個會按所問之事選取用神。
如果你在用排盤工具
- 出生在交節日前後一天? 大致是公曆每月的第一週,見二十四節氣。確認你的工具用的是精確時刻:把出生時間前後各調一小時,年柱或月柱應當在正確的分鐘翻轉,而不是在午夜。
- 出生在 23 點到午夜之間? 弄清工具採用哪種子時規則,再決定你自己從哪一派。
- 出生地遠離時區基準經線,或當時實行日光節約時間? 時柱,有時連日柱,都取決於真太陽時。
天時錄怎樣處理
我們的八字排盤用 lunar-javascript 把出生時刻與每個「節」的時刻逐秒比較,它的節氣在全部測試中都與 DE421 吻合。晚子時規則是一個明確的選項(預設換日,也可以選不換日),命盤會列出所做的真太陽時修正。紫微斗數的包裝層從不走 iztro 有問題的晚子時路徑;六爻引擎則依古籍表格自行編寫,測試中與兩個獨立的函式庫在 10,240 和 7,680 個生成案例上對照,沒有一處不同。上面這些案例都保留為回歸測試,函式庫升級只要改變其中任何一個,建置就會失敗。
撰寫解讀的 AI 拿到的是已經算好的命盤,無權改動。曆法是算術,只有文字由模型來寫。
引用本文
歡迎引用或連結本頁。如果你維護排盤工具或曆法函式庫,想要完整的案例清單,或者認為我們某個案例有誤,請聯絡我們。