关于php公历农历的互相转换,你可能会需要!
导读:收集整理的这篇文章主要介绍了关于php公历农历的互相转换,你可能会需要!,觉得挺不错的,现在分享给大家,也给大家做个参考。废话不多,直接上代码<?phpclass Lunar{ /** * Created by 闻海南....
收集整理的这篇文章主要介绍了关于php公历农历的互相转换,你可能会需要!,觉得挺不错的,现在分享给大家,也给大家做个参考。废话不多,直接上代码
?phpclass Lunar{
/** * Created by 闻海南. * User: timeless * Date: 2018-5-29 * Time: 上午9:32s */ VAR $MIN_YEAR = 1891;
var $MAX_YEAR = 2100;
var $lunarInfo = array( array(0, 2, 9, 21936), array(6, 1, 30, 9656), array(0, 2, 17, 9584), array(0, 2, 6, 21168), array(5, 1, 26, 43344), array(0, 2, 13, 59728), array(0, 2, 2, 27296), array(3, 1, 22, 44368), array(0, 2, 10, 43856), array(8, 1, 30, 19304), array(0, 2, 19, 19168), array(0, 2, 8, 42352), array(5, 1, 29, 21096), array(0, 2, 16, 53856), array(0, 2, 4, 55632), array(4, 1, 25, 27304), array(0, 2, 13, 22176), array(0, 2, 2, 39632), array(2, 1, 22, 19176), array(0, 2, 10, 19168), array(6, 1, 30, 42200), array(0, 2, 18, 42192), array(0, 2, 6, 53840), array(5, 1, 26, 54568), array(0, 2, 14, 46400), array(0, 2, 3, 54944), array(2, 1, 23, 38608), array(0, 2, 11, 38320), array(7, 2, 1, 18872), array(0, 2, 20, 18800), array(0, 2, 8, 42160), array(5, 1, 28, 45656), array(0, 2, 16, 27216), array(0, 2, 5, 27968), array(4, 1, 24, 44456), array(0, 2, 13, 11104), array(0, 2, 2, 38256), array(2, 1, 23, 18808), array(0, 2, 10, 18800), array(6, 1, 30, 25776), array(0, 2, 17, 54432), array(0, 2, 6, 59984), array(5, 1, 26, 27976), array(0, 2, 14, 23248), array(0, 2, 4, 11104), array(3, 1, 24, 37744), array(0, 2, 11, 37600), array(7, 1, 31, 51560), array(0, 2, 19, 51536), array(0, 2, 8, 54432), array(6, 1, 27, 55888), array(0, 2, 15, 46416), array(0, 2, 5, 22176), array(4, 1, 25, 43736), array(0, 2, 13, 9680), array(0, 2, 2, 37584), array(2, 1, 22, 51544), array(0, 2, 10, 43344), array(7, 1, 29, 46248), array(0, 2, 17, 27808), array(0, 2, 6, 46416), array(5, 1, 27, 21928), array(0, 2, 14, 19872), array(0, 2, 3, 42416), array(3, 1, 24, 21176), array(0, 2, 12, 21168), array(8, 1, 31, 43344), array(0, 2, 18, 59728), array(0, 2, 8, 27296), array(6, 1, 28, 44368), array(0, 2, 15, 43856), array(0, 2, 5, 19296), array(4, 1, 25, 42352), array(0, 2, 13, 42352), array(0, 2, 2, 21088), array(3, 1, 21, 59696), array(0, 2, 9, 55632), array(7, 1, 30, 23208), array(0, 2, 17, 22176), array(0, 2, 6, 38608), array(5, 1, 27, 19176), array(0, 2, 15, 19152), array(0, 2, 3, 42192), array(4, 1, 23, 53864), array(0, 2, 11, 53840), array(8, 1, 31, 54568), array(0, 2, 18, 46400), array(0, 2, 7, 46752), array(6, 1, 28, 38608), array(0, 2, 16, 38320), array(0, 2, 5, 18864), array(4, 1, 25, 42168), array(0, 2, 13, 42160), array(10, 2, 2, 45656), array(0, 2, 20, 27216), array(0, 2, 9, 27968), array(6, 1, 29, 44448), array(0, 2, 17, 43872), array(0, 2, 6, 38256), array(5, 1, 27, 18808), array(0, 2, 15, 18800), array(0, 2, 4, 25776), array(3, 1, 23, 27216), array(0, 2, 10, 59984), array(8, 1, 31, 27432), array(0, 2, 19, 23232), array(0, 2, 7, 43872), array(5, 1, 28, 37736), array(0, 2, 16, 37600), array(0, 2, 5, 51552), array(4, 1, 24, 54440), array(0, 2, 12, 54432), array(0, 2, 1, 55888), array(2, 1, 22, 23208), array(0, 2, 9, 22176), array(7, 1, 29, 43736), array(0, 2, 18, 9680), array(0, 2, 7, 37584), array(5, 1, 26, 51544), array(0, 2, 14, 43344), array(0, 2, 3, 46240), array(4, 1, 23, 46416), array(0, 2, 10, 44368), array(9, 1, 31, 21928), array(0, 2, 19, 19360), array(0, 2, 8, 42416), array(6, 1, 28, 21176), array(0, 2, 16, 21168), array(0, 2, 5, 43312), array(4, 1, 25, 29864), array(0, 2, 12, 27296), array(0, 2, 1, 44368), array(2, 1, 22, 19880), array(0, 2, 10, 19296), array(6, 1, 29, 42352), array(0, 2, 17, 42208), array(0, 2, 6, 53856), array(5, 1, 26, 59696), array(0, 2, 13, 54576), array(0, 2, 3, 23200), array(3, 1, 23, 27472), array(0, 2, 11, 38608), array(11, 1, 31, 19176), array(0, 2, 19, 19152), array(0, 2, 8, 42192), array(6, 1, 28, 53848), array(0, 2, 15, 53840), array(0, 2, 4, 54560), array(5, 1, 24, 55968), array(0, 2, 12, 46496), array(0, 2, 1, 22224), array(2, 1, 22, 19160), array(0, 2, 10, 18864), array(7, 1, 30, 42168), array(0, 2, 17, 42160), array(0, 2, 6, 43600), array(5, 1, 26, 46376), array(0, 2, 14, 27936), array(0, 2, 2, 44448), array(3, 1, 23, 21936), array(0, 2, 11, 37744), array(8, 2, 1, 18808), array(0, 2, 19, 18800), array(0, 2, 8, 25776), array(6, 1, 28, 27216), array(0, 2, 15, 59984), array(0, 2, 4, 27424), array(4, 1, 24, 43872), array(0, 2, 12, 43744), array(0, 2, 2, 37600), array(3, 1, 21, 51568), array(0, 2, 9, 51552), array(7, 1, 29, 54440), array(0, 2, 17, 54432), array(0, 2, 5, 55888), array(5, 1, 26, 23208), array(0, 2, 14, 22176), array(0, 2, 3, 42704), array(4, 1, 23, 21224), array(0, 2, 11, 21200), array(8, 1, 31, 43352), array(0, 2, 19, 43344), array(0, 2, 7, 46240), array(6, 1, 27, 46416), array(0, 2, 15, 44368), array(0, 2, 5, 21920), array(4, 1, 24, 42448), array(0, 2, 12, 42416), array(0, 2, 2, 21168), array(3, 1, 22, 43320), array(0, 2, 9, 26928), array(7, 1, 29, 29336), array(0, 2, 17, 27296), array(0, 2, 6, 44368), array(5, 1, 26, 19880), array(0, 2, 14, 19296), array(0, 2, 3, 42352), array(4, 1, 24, 21104), array(0, 2, 10, 53856), array(8, 1, 30, 59696), array(0, 2, 18, 54560), array(0, 2, 7, 55968), array(6, 1, 27, 27472), array(0, 2, 15, 22224), array(0, 2, 5, 19168), array(4, 1, 25, 42216), array(0, 2, 12, 42192), array(0, 2, 1, 53584), array(2, 1, 21, 55592), array(0, 2, 9, 54560) );
/** * 将阳历转换为阴历 * @param year 公历-年 * @param month 公历-月 * @param date 公历-日 */ function convertSolarToLunar($year, $month, $date) {
//debugger;
$yearData = $this->
lunarInfo[$year - $this->
mIN_YEAR];
if ($year == $this->
MIN_YEAR &
&
$month = 2 &
&
$date = 9) {
return array(1891, '正月', '初一', '辛卯', 1, 1, '兔');
}
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, '正月', '初一', '辛卯', 1, 1, '兔');
}
$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 . '-' . $month . '-' . $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('Y-m-d', $res + $between * 24 * 60 * 60);
$day = explode('-', $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('庚', '辛', '壬', '癸', '甲', '乙', '丙', '丁', '戊', '己');
$earth = array('申', '酉', '戌', '亥', '子', '丑', '寅', '卯', '辰', '巳', '午', '未');
$year = $year . '';
return $sky[$year{
3}
] . $earth[$year % 12];
}
/** * 根据阴历年获取生肖 * @param year 阴历年 */ function getYearZodiac($year) {
$zodiac = array('猴', '鸡', '狗', '猪', '鼠', '牛', '虎', '兔', '龙', '蛇', '马', '羊');
return $zodiac[$year % 12];
}
/** * 获取阳历月份的天数 * @param year 阳历-年 * @param month 阳历-月 */ function getSolarMonthDays($year, $month) {
$monthHash = array('1' =>
31, '2' =>
$this->
isLeapYear($year) ? 29 : 28, '3' =>
31, '4' =>
30, '5' =>
31, '6' =>
30, '7' =>
31, '8' =>
31, '9' =>
30, '10' =>
31, '11' =>
30, '12' =>
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;
$i strlen($bit);
$i++) {
$bitArray[$i] = substr($bit, $i, 1);
}
for ($k = 0, $klen = 16 - count($bitArray);
$k $klen;
$k++) {
array_unshift($bitArray, '0');
}
$bitArray = array_slice($bitArray, 0, ($leapMonth == 0 ? 12 : 13));
for ($i = 0;
$i count($bitArray);
$i++) {
$bitArray[$i] = $bitArray[$i] + 29;
}
return $bitArray;
}
/** * 获取农历每年的天数 * @param year 农历年份 */ function getLunarYearDays($year) {
$yearData = $this->
lunarInfo[$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 = '';
if ($between == 0) {
array_push($lunarArray, $year, '正月', '初一');
$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) ? ('闰' . $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('0' =>
'', '1' =>
'一', '2' =>
'二', '3' =>
'三', '4' =>
'四', '5' =>
'五', '6' =>
'六', '7' =>
'七', '8' =>
'八', '9' =>
'九', '10' =>
'十 ');
$monthHash = array('0' =>
'', '1' =>
'正月', '2' =>
'二月', '3' =>
'三月', '4' =>
'四月', '5' =>
'五月', '6' =>
'六月', '7' =>
'七月', '8' =>
'八月', '9' =>
'九月', '10' =>
'十月', '11' =>
'冬月', '12' =>
'腊月');
$res = '';
if ($isMonth) {
$res = $monthHash[$num];
}
else {
if ($num = 10) {
$res = '初' . $dateHash[$num];
}
else if ($num >
10 &
&
$num 20) {
$res = '十' . $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('2017', '03', '09');
//将阳历转换为阴历echo 'PRe>
';
print_r($month);
更多相关知识,请访问PHP中文网!
以上就是关于php公历农历的互相转换,你可能会需要!的详细内容,更多请关注其它相关文章!
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 关于php公历农历的互相转换,你可能会需要!
本文地址: https://pptw.com/jishu/596514.html
