发信人: 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;
}
?>
----
|
|