精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● PHP>>功能代码>>公历农历转换代码

主题:公历农历转换代码
发信人: siroh(方林)
整理人: dalasthunder(2003-03-13 16:02:50), 站内信件
<?php
#
# 公历农历转换,转换范围 1921-02-08 至 2021-02-11
# Email:[email protected]
#
# 算法来自C++ Builder园地 万年历组件,
# http://go6.163.com/~cbuilder/works/index.html,不过已经不能访问了! :(
#
# array ChineseCalender([ int year, int month, int day]);
#

function ChineseCalender($curYear = "", $curMonth = "", $curDay = ""){
#星期名
$WeekName = array("星期日","星期一","星期二","星期三","星期四","星期五","星期六");

#天干名称
$TianGan = array("甲","乙","丙","丁","戊","己","庚","辛","壬","癸");

#地支名称
$DiZhi = array("子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥");

#属相名称
$ShuXiang = array("鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪");

#农历日期名
$DayName = array("*","初一","初二","初三","初四","初五","初六","初七","初八","初九","初十",
"十一","十二","十三","十四","十五","十六","十七","十八","十九","二十",
"廿一","廿二","廿三","廿四","廿五","廿六","廿七","廿八","廿九","三十");

#农历月份名
$MonName = array("*","正","二","三","四","五","六","七","八","九","十","十一","腊");

#公历每月前面的天数
$MonthAdd = array(0,31,59,90,120,151,181,212,243,273,304,334);

#农历数据
$NongliData =array( 2635,333387,1701,1748,267701,694,2391,133423,1175,396438,
3402,3749,331177,1453,694,201326,2350,465197,3221,3402,
400202,2901,1386,267611,605,2349,137515,2709,464533,1738,
2901,330421,1242,2651,199255,1323,529706,3733,1706,398762,
2741,1206,267438,2647,1318,204070,3477,461653,1386,2413,
330077,1197,2637,268877,3365,531109,2900,2922,398042,2395,
1179,267415,2635,661067,1701,1748,398772,2742,2391,330031,
1175,1611,200010,3749,527717,1452,2742,332397,2350,3222,
268949,3402,3493,133973,1386,464219,605,2349,334123,2709,
2890,267946,2773,592565,1210,2651,395863,1323,2707,265877);

$curDate=sprintf("%04d-%02d-%02d", $curYear, $curMonth, $curDay);
if($curDate < "1921-02-08" or $curDate > "2021-02-11"){
        $curDate=date("Y-m-d",time());
        list($curYear, $curMonth, $curDay) = split("-", $curDate);
    }
     
    #计算到初始时间1921年2月8日的天数:1921-02-08(正月初一)
    $TheDate = ($curYear-1921) * 365 + intval(($curYear - 1921) / 4) + $curDay + $MonthAdd[$curMonth - 1] - 38 + ((($curYear % 4) == 0 && $curMonth > 2) ? 1 : 0);

    #计算星期
    $curWeekday = $TheDate % 7 + 1;    

    #计算农历天干、地支、月、日
    $isEnd = 0;
    for($m = 0; $m < 100; $m ++){
if($NongliData[$m] < 4095) $k = 11;
else $k = 12;
for($n = $k; $n >= 0; $n --){
            $bit = ($NongliData[$m] >> $n) & 1;
            if($TheDate <= 29 + $bit){
$isEnd = 1;
break;
}
$TheDate = $TheDate - 29 - $bit;
}
if($isEnd == 1) break;
}

$curYear = 1921 + $m;
$curMonth = $k - $n + 1;
$curDay = $TheDate;

if($k == 12){
if($curMonth == (intval($NongliData[$m] / 65536) + 1)) $curMonth = 1 - $curMonth;
elseif($curMonth > (intval($NongliData[$m] / 65536) + 1)) $curMonth = $curMonth - 1;
    }
    
    #公历日期 
    $ChineseDate["Date"]     = $curDate;
    #星期
    $ChineseDate["Weekday"]  = $WeekName[$curWeekday];
    #生肖
    $ChineseDate["ShuXiang"] = $ShuXiang[(($curYear - 4) % 60) % 12];
    #农历天干
    $ChineseDate["TianGan"]  = $TianGan[(($curYear - 4) % 60) % 10];
    #农历地支
    $ChineseDate["Dizhi"]    = $DiZhi[(($curYear-4) % 60) % 12];
    #农历甲子
    $ChineseDate["JiaZi"]    = $ChineseDate["TianGan"] . $ChineseDate["Dizhi"];
    #农历年
    $ChineseDate["Year"]     = $ChineseDate["JiaZi"] . "年";
    #农历月
    $ChineseDate["Month"]    = (($curMonth < 1) ? "闰" . $MonName[-1 * $curMonth] : $MonName[$curMonth])."月";
#农历日
$ChineseDate["Day"] = $DayName[$curDay];

return $ChineseDate;
}

?>


----
  

[关闭][返回]