Skip to main content

生辰八字

生辰八字(又稱「四柱」)的排盤,核心邏輯是將我們常用的西元陽曆時間,轉換成中國傳統的天干地支(干支)紀年法。程式碼中,這個轉換過程被拆解成了四個核心步驟,分別計算出:年柱、月柱、日柱、時柱,每一柱由一個天干和一個地支組成,共四柱八字。 基礎大腦:干支與五行對照表 基礎大腦:干支與五行對照表 在計算開始前,程式碼先宣告了基礎的對照陣列:

  • 十天干(索引 0~9):甲、乙、丙、丁、戊、己、庚、辛、壬、癸。
  • 十二地支(索引 0~11):子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥。
  1. 年柱的計算(Get Year GanZhi) 年柱代表出生年份的干支。 計算原理: 因為干支紀年是以 60 年為一個循環(六十甲子),只要知道某個基準年份的干支,就能推算出任何年份的干支。在歷史上,西元 4 年剛好是「甲子年」。 程式碼實作:
function getYearGanZhi(y) {
return {
gan: ((y - 4) % 10 + 10) % 10,
zhi: ((y - 4) % 12 + 12) % 12,
};
}
  • 天干(10個一循環):將 (西元年份 - 4) 餘 10,就能得到天干的索引。
  • 地支(12個一循環):將 (西元年份 - 4) 餘 12,就能得到地支的索引。
  • 註:後面的 + 10) % 10 是為了防止西元前的年份算出來變成負數。
  1. 月柱的計算(Get Month GanZhi) 月柱代表出生月份的干支。這是在計算八字時最容易出錯、也最複雜的一步,因為傳統八字的月份不是看農曆初一,也不是看陽曆 1 號,而是看「節氣」! 計算原理:
  2. 地支是固定的:傳統上,正月(立春開始)的地支固定是「寅」,二月是「卯」……十二月是「丑」。
  3. 節氣決定邊界(JIE_DAYS):程式中定義了 JIE_DAYS = [6, 4, 6, 5, 6, 6, 7, 7, 8, 8, 7, 7]。這代表 1 月的小寒大約在 6 號,2 月的立春大約在 4 號。
  • 如果你是 1971 年 2 月 3 日出生,雖然是 2 月,但因為還沒過 2 月 4 日(立春),所以在八字上你仍然算「上一個月(也就是去年的十二月)」。
  1. 天干由年干決定:這在命理學上叫「五虎遁」。只要知道年干是什麼,就能推算出該年正月的月干是什麼。 程式碼實作:
function getMonthGanZhi(y, m, d) {
// 若當前日期小於當月的「節」,則屬於上一個月的月建
let month = d < JIE_DAYS[m - 1] ? m - 1 : m;
if (month <= 0) month += 12;

// 陽曆月份對應月支:1月=丑(1), 2月=寅(2) ... 12月=子(0)
const zhiMap = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0];
const mz = zhiMap[month - 1];

// 月干公式:(年干 * 2 + 月支) % 10
const yg = getYearGanZhi(y).gan;
const mg = (yg * 2 + mz) % 10;

return { gan: mg, zhi: mz };
}
  • 程式先判斷有沒有過節氣,決定你真正的「八字月份」。
  • 再透過公式 (年干 * 2 + 月支) % 10 自動算出月干(五虎遁的數學簡化版)。
  1. 日柱的計算(Get Day GanZhi) 日柱代表出生那一天的干支,在八字中也代表「日主」(自己)。 計算原理: 由於每年的天數(365天或366天)無法被 60 整除,所以日柱無法用單一公式簡單推算,必須累積計算從某個基準點到今天總共過了幾天。 程式碼實作: 此處程式選擇的基準點是 西元 1900 年 1 月 1 日,這一天在傳統干支中是「甲戌日」(在六十甲子中序號是 10)。
function getDayGanZhi(y, m, d) {
let days = 0;
// 1. 先加總從 1900 年到今年以前,所有年份的總天數(考慮閏年)
for (let yr = 1900; yr < y; yr++) {
days += isLeapYear(yr) ? 366 : 365;
}
// 2. 再加上今年目前為止過了幾天
days += dayOfYear(y, m, d) - 1;

// 3. 加上基準點序號 10,除以 60 取餘數
const idx = (days + 10) % 60;

// 4. 餘數分別除以 10 和 12,得到那一天的天干、地支
return { gan: idx % 10, zhi: idx % 12 };
}
  1. 時柱的計算(Get Hour GanZhi) 時柱代表出生時辰的干支。 計算原理:
  2. 時支由時間決定:一天 24 小時被均分為 12 個時辰(一個時辰 2 小時)。 o 23:00 ~ 01:00 是子時(0) o 01:00 ~ 03:00 是丑時(1) o 依此類推,計算公式為:Math.floor((hour + 1) / 2) % 12。
  3. 時干由日干決定:這在命理學上叫做「五鼠遁」。每天「子時」的天干,會隨著當天的日干不同而改變。 程式碼實作:
function getHourGanZhi(dayGan, hour) {
const hz = Math.floor((hour + 1) / 2) % 12; // 算出地支
const hg = (dayGan * 2 + hz) % 10; // 公式算出天干
return { gan: hg, zhi: hz };
}
  • 帶入公式 (日干 * 2 + 時支) % 10,就能完美求出時辰的天干。 總結:排盤成果 當您在網頁上輸入「1971 年 11 月 12 日 10 時」並點擊計算時:
  1. 程式分別執行上述 4 個函數,拿到了 4 組天干地支。
  2. 畫面上的 bazi-display 區域就會將這四組天干地支橫向排列,繪製成您看到的生辰八字(年柱、月柱、日柱、時柱)。
  3. 接著,程式再進一步去抓取這八個字背後所代表的五行能量,進行加權與養生風險評估。 這就是整個八字排盤從時間輸入到干支產生的完整計算邏輯!