// 农历天干
$mten = array("null", "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸");
// 农历地支
$mtwelve = array("null", "子(鼠)", "丑(牛)", "寅(虎)", "卯(兔)", "辰(龙)","巳(蛇)", "午(马)", "未(羊)", "申(猴)", "酉(鸡)", "戌(狗)", "亥(猪)");
// 农历月份
$mmonth = array("闰", "正", "二", "三", "四", "五", "六","七", "八", "九", "十", "十一", "十二", "月");
// 农历日
$mday = array("null", "初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十",
"十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十",
"廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十"); // 星期
$weekday = array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六");
// 阳历总天数 至1900年12月21日
$total = 11; // 阴历总天数
$mtotal = 0;
$year = intval($year);
$month = intval($month);
$day = intval($day); if ($year < 1901 || $year > 2020 || $month < 1 || $month > 12 || $day < 1 || $day > 31) {
exit('年份或者格式出错,年份只支持1901到2020!');
} // 获得日期时间戳
$postDate = mktime(0, 0, 0, $month, $day, $year); $thisDay = getdate($postDate); //print_R($thisDay);exit; $cur_wday = $thisDay["wday"]; for($y = 1901; $y < $thisDay["year"]; $y++) {
// 计算到所求日期阳历的总天数-自1900年12月21日始,先算年的和
$total += 365;
if ($y % 4 == 0){
$total++;
}
}switch ($thisDay["mon"]) { // 再加当年的几个月
case 12:
$total += 30;
case 11:
$total += 31;
case 10:
$total += 30;
case 9:
$total += 31;
case 8:
$total += 31;
case 7:
$total += 30;
case 6:
$total += 31;
case 5:
$total += 30;
case 4:
$total += 31;
case 3:
$total += 28;
case 2:
$total += 31;
}if ($thisDay["year"] % 4 == 0 && $thisDay["mon"] > 2) {
$total++; //如果当年是闰年还要加一天
}$total = $total + $thisDay["mday"]-1; //加当月的天数$flag = 0; //判断跳出循环的条件
$j = 0;
while ($j <= 120) { // 用农历的天数累加来判断是否超过阳历的天数
$i = 1;
while ($i <= 13) {
$mtotal += $everymonth[$j][$i];
if ($mtotal >= $total) {
$flag = 1;
break;
}
$i++;
}
if ($flag == 1) break;
$j++;
}if ($everymonth[$j][0] <> 0 && $everymonth[$j][0] < $i) {
//对闰月修补
$mm = $i-1;
} else {
$mm = $i;
}if ($i == $everymonth[$j][0] + 1 && $everymonth[$j][0] <> 0) {
$nlmon = $mmonth[0] . $mmonth[$mm]; #闰月
$numMonth = $mm;//输出农历数字格式月份
} else {
$nlmon = $mmonth[$mm] . $mmonth[13];
$numMonth = $mm;
}
// 计算所求月份1号的农历日期
$md = $everymonth[$j][$i] - ($mtotal - $total);
if ($md > $everymonth[$j][$i]) {
$md -= $everymonth[$j][$i];
}
$nlday = $mday[$md];
$numDay = $md;//输出农历数字格式日期$nowday = date("Y年n月j日 ", $postDate) . $weekday[$cur_wday]."
".$mten[$everymonth[$j][14]].$mtwelve[$everymonth[$j][15]]."年".$nlmon.$nlday;
$lunarCalendar = array('year'=>$year,
'yearname'=>$mten[$everymonth[$j][14]] . $mtwelve[$everymonth[$j][15]] . "年",
'displaymonth'=>$nlmon,
'displayday'=>$nlday,
'displayweek'=>$weekday[$cur_wday],
'month'=>$numMonth,
'day'=>$numDay);
return $lunarCalendar;
}