废话不多,直接上代码
lunarInfo[$year - $this->MIN_YEAR]; if ($year == $this->MIN_YEAR && $month <= 2 && $date <= 9) { return array(1891, &#39;正月&#39;, &#39;初一&#39;, &#39;辛卯&#39;, 1, 1, &#39;兔&#39;); } return $this->getLunarByBetween($year, $this->getDaysBetweenSolar($year, $month, $date, $yearData[1], $yearData[2])); } function convertSolarMonthToLunar($year, $month) { $yearData = $this->lunarInfo[$year - $this->MIN_YEAR]; if ($year == $this->MIN_YEAR && $month <= 2 && $date <= 9) { return array(1891, &#39;正月&#39;, &#39;初一&#39;, &#39;辛卯&#39;, 1, 1, &#39;兔&#39;); } $month_days_ary = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); $dd = $month_days_ary[$month]; if ($this->isLeapYear($year) && $mOnth== 2) $dd++; $lunar_ary = array(); for ($i = 1; $i <$dd; $i++) { $array = $this->getLunarByBetween($year, $this->getDaysBetweenSolar($year, $month, $i, $yearData[1], $yearData[2])); $array[] = $year . &#39;-&#39; . $month . &#39;-&#39; . $i; $lunar_ary[$i] = $array; } return $lunar_ary; } /** * 将阴历转换为阳历 * @param year 阴历-年 * @param month 阴历-月,闰月处理:例如如果当年闰五月,那么第二个五月就传六月,相当于阴历有13个月,只是有的时候第13个月的天数为0 * @param date 阴历-日 */ function convertLunarToSolar($year, $month, $date) { $yearData = $this->lunarInfo[$year - $this->MIN_YEAR]; $between = $this->getDaysBetweenLunar($year, $month, $date); $res = mktime(0, 0, 0, $yearData[1], $yearData[2], $year); $res = date(&#39;Y-m-d&#39;, $res + $between * 24 * 60 * 60); $day = explode(&#39;-&#39;, $res); $year = $day[0]; $mOnth= $day[1]; $day = $day[2]; return array($year, $month, $day); } /** * 判断是否是闰年 * @param year */ function isLeapYear($year) { return (($year % 4 == 0 && $year % 100 != 0) || ($year % 400 == 0)); } /** * 获取干支纪年 * @param year */ function getLunarYearName($year) { $sky = array(&#39;庚&#39;, &#39;辛&#39;, &#39;壬&#39;, &#39;癸&#39;, &#39;甲&#39;, &#39;乙&#39;, &#39;丙&#39;, &#39;丁&#39;, &#39;戊&#39;, &#39;己&#39;); $earth = array(&#39;申&#39;, &#39;酉&#39;, &#39;戌&#39;, &#39;亥&#39;, &#39;子&#39;, &#39;丑&#39;, &#39;寅&#39;, &#39;卯&#39;, &#39;辰&#39;, &#39;巳&#39;, &#39;午&#39;, &#39;未&#39;); $year = $year . &#39;&#39;; return $sky[$year{3}] . $earth[$year % 12]; } /** * 根据阴历年获取生肖 * @param year 阴历年 */ function getYearZodiac($year) { $zodiac = array(&#39;猴&#39;, &#39;鸡&#39;, &#39;狗&#39;, &#39;猪&#39;, &#39;鼠&#39;, &#39;牛&#39;, &#39;虎&#39;, &#39;兔&#39;, &#39;龙&#39;, &#39;蛇&#39;, &#39;马&#39;, &#39;羊&#39;); return $zodiac[$year % 12]; } /** * 获取阳历月份的天数 * @param year 阳历-年 * @param month 阳历-月 */ function getSolarMonthDays($year, $month) { $mOnthHash= array(&#39;1&#39; => 31, &#39;2&#39; => $this->isLeapYear($year) ? 29 : 28, &#39;3&#39; => 31, &#39;4&#39; => 30, &#39;5&#39; => 31, &#39;6&#39; => 30, &#39;7&#39; => 31, &#39;8&#39; => 31, &#39;9&#39; => 30, &#39;10&#39; => 31, &#39;11&#39; => 30, &#39;12&#39; => 31); return $monthHash["$month"]; } /** * 获取阴历月份的天数 * @param year 阴历-年 * @param month 阴历-月,从一月开始 */ function getLunarMonthDays($year, $month) { $mOnthData= $this->getLunarMonths($year); return $monthData[$month - 1]; } /** * 获取阴历每月的天数的数组 * @param year */ function getLunarMonths($year) { $yearData = $this->lunarInfo[$year - $this->MIN_YEAR]; $leapMOnth= $yearData[0]; $bit = decbin($yearData[3]); for ($i = 0; $ilunarInfo[$year - $this->MIN_YEAR]; $mOnthArray= $this->getLunarYearMonths($year); $len = count($monthArray); return ($monthArray[$len - 1] == 0 ? $monthArray[$len - 2] : $monthArray[$len - 1]); } function getLunarYearMonths($year) {//debugger; $mOnthData= $this->getLunarMonths($year); $res = array(); $temp = 0; $yearData = $this->lunarInfo[$year - $this->MIN_YEAR]; $len = ($yearData[0] == 0 ? 12 : 13); for ($i = 0; $i <$len; $i++) { $temp = 0; for ($j = 0; $j <= $i; $j++) { $temp += $monthData[$j]; } array_push($res, $temp); } return $res; } /** * 获取闰月 * @param year 阴历年份 */ function getLeapMonth($year) { $yearData = $this->lunarInfo[$year - $this->MIN_YEAR]; return $yearData[0]; } /** * 计算阴历日期与正月初一相隔的天数 * @param year * @param month * @param date */ function getDaysBetweenLunar($year, $month, $date) { $yearMOnth= $this->getLunarMonths($year); $res = 0; for ($i = 1; $i <$month; $i++) { $res += $yearMonth[$i - 1]; } $res += $date - 1; return $res; } /** * 计算2个阳历日期之间的天数 * @param year 阳历年 * @param cmonth * @param cdate * @param dmonth 阴历正月对应的阳历月份 * @param ddate 阴历初一对应的阳历天数 */ function getDaysBetweenSolar($year, $cmonth, $cdate, $dmonth, $ddate) { $a = mktime(0, 0, 0, $cmonth, $cdate, $year); $b = mktime(0, 0, 0, $dmonth, $ddate, $year); return ceil(($a - $b) / 24 / 3600); } /** * 根据距离正月初一的天数计算阴历日期 * @param year 阳历年 * @param between 天数 */ function getLunarByBetween($year, $between) {//debugger; $lunarArray = array(); $yearMOnth= array(); $t = 0; $e = 0; $leapMOnth= 0; $m = &#39;&#39;; if ($between == 0) { array_push($lunarArray, $year, &#39;正月&#39;, &#39;初一&#39;); $t = 1; $e = 1; } else { $year = $between > 0 ? $year : ($year - 1); $yearMOnth= $this->getLunarYearMonths($year); $leapMOnth= $this->getLeapMonth($year); $between = $between > 0 ? $between : ($this->getLunarYearDays($year) + $between); for ($i = 0; $i <13; $i++) { if ($between == $yearMonth[$i]) { $t = $i + 2; $e = 1; break; } else if ($between <$yearMonth[$i]) { $t = $i + 1; $e = $between - (empty($yearMonth[$i - 1]) ? 0 : $yearMonth[$i - 1]) + 1; break; } } $m = ($leapMonth != 0 && $t == $leapMonth + 1) ? (&#39;闰&#39; . $this->getCapitalNum($t - 1, true)) : $this->getCapitalNum(($leapMonth != 0 && $leapMonth + 1 <$t ? ($t - 1) : $t), true); array_push($lunarArray, $year, $m, $this->getCapitalNum($e, false)); } array_push($lunarArray, $this->getLunarYearName($year));// 天干地支 array_push($lunarArray, $t, $e); array_push($lunarArray, $this->getYearZodiac($year));// 12生肖 array_push($lunarArray, $leapMonth);// 闰几月 return $lunarArray; } /** * 获取数字的阴历叫法 * @param num 数字 * @param isMonth 是否是月份的数字 */ function getCapitalNum($num, $isMonth) { $isMOnth= $isMonth || false; $dateHash = array(&#39;0&#39; => &#39;&#39;, &#39;1&#39; => &#39;一&#39;, &#39;2&#39; => &#39;二&#39;, &#39;3&#39; => &#39;三&#39;, &#39;4&#39; => &#39;四&#39;, &#39;5&#39; => &#39;五&#39;, &#39;6&#39; => &#39;六&#39;, &#39;7&#39; => &#39;七&#39;, &#39;8&#39; => &#39;八&#39;, &#39;9&#39; => &#39;九&#39;, &#39;10&#39; => &#39;十 &#39;); $mOnthHash= array(&#39;0&#39; => &#39;&#39;, &#39;1&#39; => &#39;正月&#39;, &#39;2&#39; => &#39;二月&#39;, &#39;3&#39; => &#39;三月&#39;, &#39;4&#39; => &#39;四月&#39;, &#39;5&#39; => &#39;五月&#39;, &#39;6&#39; => &#39;六月&#39;, &#39;7&#39; => &#39;七月&#39;, &#39;8&#39; => &#39;八月&#39;, &#39;9&#39; => &#39;九月&#39;, &#39;10&#39; => &#39;十月&#39;, &#39;11&#39; => &#39;冬月&#39;, &#39;12&#39; => &#39;腊月&#39;); $res = &#39;&#39;; if ($isMonth) { $res = $monthHash[$num]; } else { if ($num <= 10) { $res = &#39;初&#39; . $dateHash[$num]; } else if ($num > 10 && $num <20) { $res = &#39;十&#39; . $dateHash[$num - 10]; } else if ($num == 20) { $res = "二十"; } else if ($num > 20 && $num <30) { $res = "廿" . $dateHash[$num - 20]; } else if ($num == 30) { $res = "三十"; } } return $res; } /*class end*/ } header("Content-Type:text/html;charset=utf-8"); $lunar = new Lunar(); $mOnth= $lunar->convertSolarToLunar(&#39;2017&#39;, &#39;03&#39;, &#39;09&#39;);//将阳历转换为阴历 echo &#39; &#39;; print_r($month);更多相关知识,请访问PHP中文网!
以上就是关于php公历农历的互相转换,你可能会需要!的详细内容,更多请关注 第一PHP社区 其它相关文章!