天干地支(簡稱「干支」)是中國傳統紀年、紀月、紀日、紀時系統。本文提供兩種 PHP 演算法實現,可快速計算任意年份對應的干支紀年。
1900 年為「庚子」年。以 1900 年為基準,計算目標年份與 1900 年的年差,再加上 1900 年在甲子序列中的索引偏移 (36),即可取模得到結果。
<?php
$TGDZ = [
['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸'], // 天干 0-9
['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'] // 地支 0-11
];
$year = 2014;
// 1900 年是庚子,天干索引 6 (庚),地支索引 0 (子)
// 但在陣列中庚索引為 6,子索引為 0
// 為了讓 1900 % 10 = 0 對應庚,1900 % 12 = 0 對應子
// 需要將陣列旋轉,或計算偏移量
// 這裡採用偏移量:1900 年距離甲子年的偏移
$offset = 36; // 經驗值:1900 - 1864 (甲子年) = 36
$index = $year - 1900 + $offset; // 2014 - 1900 + 36 = 150
$tianGan = $TGDZ[0][$index % 10]; // 150 % 10 = 0 -> 甲
$diZhi = $TGDZ[1][$index % 12]; // 150 % 12 = 6 -> 午
echo "$year 年為農歷[$tianGan$diZhi]年"; // 輸出:2014 年為農歷[甲午]年
?>
將天干、地支陣列預先旋轉,使得 年份 % 10、年份 % 12 直接對應正確索引。以 1900 年 (庚子) 為基準對齊:
經驗證,以下陣列排列可直接用年份取模:
<?php
$TGDZ = [
['庚', '辛', '壬', '癸', '甲', '乙', '丙', '丁', '戊', '己'], // 天干:索引 0=庚 對應年份%10=0
['申', '酉', '戌', '亥', '子', '丑', '寅', '卯', '辰', '巳', '午', '未'] // 地支:索引 4=子 對應年份%12=4
];
for ($year = 1900; $year <= 2099; $year++) {
$tianGan = $TGDZ[0][$year % 10];
$diZhi = $TGDZ[1][$year % 12];
echo "$year 年為農歷[$tianGan$diZhi]年<br>";
}
?>
| 年份 | 干支 | 備註 |
|---|---|---|
| 1900 | 庚子 | 基準年 |
| 1984 | 甲子 | 甲子循環起始 |
| 2000 | 庚辰 | 千禧年 |
| 2024 | 甲辰 | 本年 |
| 2044 | 甲子 | 下一個甲子年 |
年干支只是起點。完整八字需結合:
完整實作涉及節氣精確時間、閏月處理、時區換算,建議使用成熟庫(如 laravel-lunar、overtrue/laravel-festival、Python lunarcalendar)。
天干地支計算核心是 模 60 循環。掌握基準年對齊技巧,即可用簡潔代碼實現年份干支查詢。月日時計算複雜度顯著上升,實務開發建議直接引用經過驗證的開源庫,避免邊界條件錯誤。