php实现阳历阴历互转的方法
发布时间:2020-12-13 02:54:29 所属栏目:PHP教程 来源:网络整理
导读:《:php实现阳历阴历互转的方法》要点: 本文介绍了:php实现阳历阴历互转的方法,希望对您有用。如果有疑问,可以联系我们。 最近对阳历转阴历从而得到相应节日的算法这方面比拟感兴趣,于是就在网上搜了一圈.不错,还算是找到一个比拟不错的php类,实现了将阳
《:php实现阳历阴历互转的方法》要点: 最近对阳历转阴历从而得到相应节日的算法这方面比拟感兴趣,于是就在网上搜了一圈.不错,还算是找到一个比拟不错的php类,实现了将阳历转换为阴历(农历),阴历转换为阳历的算法,同时还能获取干支纪年,生肖,以及相应的阴历的中文叫法等等,功能还是挺齐全的,在这里分享给大家. class Lunar{ var $MIN_YEAR=1891; var $MAX_YEAR=2100; var $lunarInfo=array( array(0,2,9,21936),array(6,1,30,9656),array(0,17,9584),6,21168),array(5,26,43344),13,59728),27296),array(3,22,44368),10,43856),array(8,19304),19,19168),8,42352),29,21096),16,53856),4,55632),array(4,25,27304),22176),39632),array(2,19176),42200),18,42192),53840),54568),14,46400),3,54944),23,38608),11,38320),array(7,18872),20,18800),42160),28,45656),27216),5,27968),24,44456),11104),38256),18808),25776),54432),59984),27976),23248),37744),37600),31,51560),51536),27,55888),15,46416),43736),9680),37584),51544),46248),27808),21928),19872),42416),21176),12,19296),21088),21,59696),23208),19152),53864),7,46752),18864),42168),array(10,44448),43872),27432),23232),37736),51552),54440),46240),array(9,19360),43312),29864),19880),42208),54576),23200),27472),array(11,53848),54560),55968),46496),22224),19160),43600),46376),27936),27424),43744),51568),42704),21224),21200),43352),21920),42448),43320),26928),29336),21104),42216),53584),55592),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,'正月','初一','辛卯','兔'); } return $this->getLunarByBetween($year,$this->getDaysBetweenSolar($year,$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,'兔'); } $month_days_ary=array(31,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,$i,$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,$date){ $yearData=$this->lunarInfo[$year-$this->MIN_YEAR]; $between=$this->getDaysBetweenLunar($year,$date); $res=mktime(0,$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,$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,1); } for($k=0,$klen=16-count($bitArray);$k<$klen;$k++){ array_unshift($bitArray,'0'); } $bitArray=array_slice($bitArray,($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,$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,$year); $b=mktime(0,$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,$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; } } 使用办法如下: <?php header("Content-Type:text/html;charset=utf-8"); $lunar=new Lunar(); $month=$lunar->convertSolarToLunar(2013,07,08);//将阳历转换为阴历 echo '<pre>'; print_r($month); 打印成果如下: 编程之家培训学院每天发布《:php实现阳历阴历互转的方法》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |