首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 實作天干地支紀年計算器完整範例

     編輯:PHP 綜合知識

中國傳統干支紀年法與 PHP 實作

天干地支 (簡稱干支) 是中國古代曆法的核心系統。十天干 (甲乙丙丁戊己庚辛壬癸) 與十二地支 (子丑寅卯辰巳午未申酉戌亥) 依序配合,形成六十甲子循環。本文介紹干支算法原理,並提供兩種 PHP 實作方式。

干支紀年基礎知識

  • 十天干:甲、乙、丙、丁、戊、己、庚、辛、壬、癸 (10 個)
  • 十二地支:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥 (12 個)
  • 六十甲子:最小公倍數 LCM(10,12)=60,形成 60 年一循環
  • 應用範圍:紀年、紀月、紀日、紀時 (四柱八字)

演算法 1:基於 1900 年基準點計算

以 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) . "]年";  // 輸出: 甲午
?>

演算法 2:直接取模運算 (1900-2099 年適用)

觀察規律: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,每兩小時一支
    }
}
?>

應用場景與注意事項

  • 農曆新年邊界:干支紀年在立春或農曆正月初一切換,學派不同
  • 公元前年份:天文年份計算 (公元前 1 年 = 年份 0),需特殊處理
  • 閏月處理:農曆閏月不影響干支紀月,以節氣為準
  • 時區問題:日柱切換點為當地子時 (23:00),需考慮時區與經度修正

干支計算雖看似簡單,但涉及曆法、天文、節氣等多重知識。實務應用建議使用成熟的曆法庫 (如 PHP Chinese Calendar Library) 確保準確性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved