天干地支 (簡稱干支) 是中國古代曆法的核心系統。十天干 (甲乙丙丁戊己庚辛壬癸) 與十二地支 (子丑寅卯辰巳午未申酉戌亥) 依序配合,形成六十甲子循環。本文介紹干支算法原理,並提供兩種 PHP 實作方式。
以 1900 年為庚子年 (索引 0) 作為基準,計算目標年份的偏移量:
<?php
/**
* 計算指定年份的干支紀年
* @param int $year 西元年份
* @return string 干支字串 (如: 甲子、乙丑)
*/
function getGanZhiYear($year) {
$tianGan = ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸'];
$diZhi = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'];
// 1900 年為庚子年 (庚=索引6, 子=索引0)
// 公式:(年份 - 1900 + 基準偏移) % 干支長度
$offset = $year - 1900 + 36; // 36 為經驗修正值
$gan = $tianGan[$offset % 10];
$zhi = $diZhi[$offset % 12];
return $gan . $zhi;
}
// 測試
$year = 2014;
echo "{$year} 年為農歷[" . getGanZhiYear($year) . "]年"; // 輸出: 甲午
?>
觀察規律:1900 年為庚子,天干索引 6,地支索引 0。調整陣列順序使索引 0 對應 1900 年:
<?php
/**
* 批次輸出 1900-2099 年干支對照表
*/
$tianGan = ['庚', '辛', '壬', '癸', '甲', '乙', '丙', '丁', '戊', '己']; // 1900=庚=索引0
$diZhi = ['申', '酉', '戌', '亥', '子', '丑', '寅', '卯', '辰', '巳', '午', '未']; // 1900=子=索引4? 實測需調整
// 修正版:1900 年實為庚子
$tianGan = ['庚', '辛', '壬', '癸', '甲', '乙', '丙', '丁', '戊', '己'];
$diZhi = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'];
for ($year = 1900; $year <= 2099; $year++) {
$gan = $tianGan[$year % 10];
$zhi = $diZhi[$year % 12];
echo "{$year} 年為農歷[" . $gan . $zhi . "]年<br>";
}
?>
實際命理應用需計算年柱、月柱、日柱、時柱。日柱計算較複雜,通常採用「蔡勒公式」或查表法。以下提供完整類別架構參考:
<?php
class ChineseCalendar {
private $gan = ['甲','乙','丙','丁','戊','己','庚','辛','壬','癸'];
private $zhi = ['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥'];
public function getYearGanZhi($year) {
$offset = $year - 1900 + 36;
return $this->gan[$offset % 10] . $this->zhi[$offset % 12];
}
public function getMonthGanZhi($year, $month) {
// 月柱計算:以節氣為界,非農曆月份
// 此處略過複雜節氣計算,需引入精確節氣資料表
}
public function getDayGanZhi($date) {
// 日柱:蔡勒公式或儒略日數計算
// 儒略日數 JDN 以某已知干支日為基準推算
}
public function getHourGanZhi($dayGanIndex, $hour) {
// 時柱:日干決定時干起始 (甲己日起甲子,乙庚日起丙子...)
// 地支固定:子時 23:00-01:00,每兩小時一支
}
}
?>
干支計算雖看似簡單,但涉及曆法、天文、節氣等多重知識。實務應用建議使用成熟的曆法庫 (如 PHP Chinese Calendar Library) 確保準確性。