当前位置:首页 > PHP教程 > php应用 > 列表

php实现阳历阴历互转的方法

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-23 21:36:36 浏览: 评论:0 

这篇文章主要介绍了php实现阳历阴历互转的方法,同时还能获取干支纪年,生肖,以及相应的阴历的中文叫法等,感兴趣的小伙伴们可以参考一下。

最近对阳历转阴历从而得到相应节日的算法这方面比较感兴趣,于是就在网上搜了一圈。不错,还算是找到一个比较不错的php类,实现了将阳历转换为阴历(农历),阴历转换为阳历的算法,同时还能获取干支纪年,生肖,以及相应的阴历的中文叫法等等,功能还是挺齐全的,在这里分享给大家。

具体类代码如下:

  1. class Lunar{  
  2.   var $MIN_YEAR=1891;  
  3.   var $MAX_YEAR=2100;  
  4.   var $lunarInfo=array(  
  5.     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),  
  6.     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),  
  7.     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),  
  8.     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),  
  9.     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),  
  10.     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),  
  11.     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),  
  12.     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),  
  13.     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),  
  14.     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),  
  15.     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),  
  16.     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),  
  17.     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),  
  18.     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),  
  19.     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),  
  20.     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),  
  21.     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),  
  22.     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),  
  23.     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),  
  24.     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),  
  25.     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),  
  26.     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),  
  27.     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),  
  28.     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),  
  29.     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),  
  30.     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),  
  31.     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),  
  32.     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),  
  33.     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),  
  34.     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),  
  35.     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),  
  36.     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),  
  37.     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),  
  38.     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),  
  39.     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)  
  40.   );  
  41.   /**  
  42.   * 将阳历转换为阴历  
  43.   * @param year 公历-年  
  44.   * @param month 公历-月  
  45.   * @param date 公历-日  
  46.   */  
  47.   function convertSolarToLunar($year,$month,$date){//debugger;  
  48.     $yearData=$this->lunarInfo[$year-$this->MIN_YEAR];  
  49.     if($year==$this->MIN_YEAR&&$month<=2&&$date<=9){  
  50.       return array(1891,'正月','初一','辛卯',1,1,'兔');  
  51.     }  
  52.     return $this->getLunarByBetween($year,$this->getDaysBetweenSolar($year,$month,$date,$yearData[1],$yearData[2]));  
  53.   }  
  54.   function convertSolarMonthToLunar($year,$month){  
  55.     $yearData=$this->lunarInfo[$year-$this->MIN_YEAR];  
  56.     if($year==$this->MIN_YEAR&&$month<=2&&$date<=9){  
  57.       return array(1891,'正月','初一','辛卯',1,1,'兔');  
  58.     }  
  59.     $month_days_ary=array(31,28,31,30,31,30,31,31,30,31,30,31);  
  60.     $dd=$month_days_ary[$month];  
  61.     if($this->isLeapYear($year)&& $month==2)$dd++;  
  62.     $lunar_ary=array();  
  63.     for ($i=1;$i<$dd;$i++){  
  64.       $array=$this->getLunarByBetween($year,$this->getDaysBetweenSolar($year,$month,$i,$yearData[1],$yearData[2]));  
  65.       $array[]=$year.'-'.$month.'-'.$i;  
  66.       $lunar_ary[$i]=$array;  
  67.     }  
  68.     return $lunar_ary;  
  69.   }  
  70.   /**  
  71.   * 将阴历转换为阳历  
  72.   * @param year 阴历-年  
  73.   * @param month 阴历-月,闰月处理:例如如果当年闰五月,那么第二个五月就传六月,相当于阴历有13个月,只是有的时候第13个月的天数为0  
  74.   * @param date 阴历-日  
  75.   */  
  76.   function convertLunarToSolar($year,$month,$date){  
  77.     $yearData=$this->lunarInfo[$year-$this->MIN_YEAR];  
  78.     $between=$this->getDaysBetweenLunar($year,$month,$date);  
  79.     $res=mktime(0,0,0,$yearData[1],$yearData[2],$year);  
  80.     $res=date('Y-m-d',$res+$between*24*60*60);  
  81.     $day=explode('-',$res);  
  82.     $year=$day[0];  
  83.     $month=$day[1];  
  84.     $day=$day[2];  
  85.     return array($year,$month,$day);  
  86.   }  
  87.   /**  
  88.   * 判断是否是闰年  
  89.   * @param year  
  90.   */  
  91.   function isLeapYear($year){  
  92.     return (($year%4==0&&$year%100!=0)||($year%400==0));  
  93.   }  
  94.   /**  
  95.   * 获取干支纪年  
  96.   * @param year  
  97.   */  
  98.   function getLunarYearName($year){  
  99.     $sky=array('庚','辛','壬','癸','甲','乙','丙','丁','戊','己');  
  100.     $earth=array('申','酉','戌','亥','子','丑','寅','卯','辰','巳','午','未');  
  101.     $year=$year.'';  
  102.     return $sky[$year{3}].$earth[$year%12];  
  103.   }  
  104.   /**  
  105.   * 根据阴历年获取生肖  
  106.   * @param year 阴历年  
  107.   */  
  108.   function getYearZodiac($year){  
  109.     $zodiac=array('猴','鸡','狗','猪','鼠','牛','虎','兔','龙','蛇','马','羊');  
  110.     return $zodiac[$year%12];  
  111.   }  
  112.   /**  
  113.   * 获取阳历月份的天数  
  114.   * @param year 阳历-年  
  115.   * @param month 阳历-月  
  116.   */  
  117.   function getSolarMonthDays($year,$month){  
  118.     $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);  
  119.     return $monthHash["$month"];  
  120.   }  
  121.   /**  
  122.   * 获取阴历月份的天数  
  123.   * @param year 阴历-年  
  124.   * @param month 阴历-月,从一月开始  
  125.   */  
  126.   function getLunarMonthDays($year,$month){  
  127.     $monthData=$this->getLunarMonths($year);  
  128.     return $monthData[$month-1];  
  129.   }  
  130.   /**  
  131.   * 获取阴历每月的天数的数组  
  132.   * @param year  
  133.   */  
  134.   function getLunarMonths($year){  
  135.     $yearData=$this->lunarInfo[$year-$this->MIN_YEAR];  
  136.     $leapMonth=$yearData[0];  
  137.     $bit=decbin($yearData[3]);  
  138.     for ($i=0;$i<strlen($bit);$i ++){  
  139.       $bitArray[$i]=substr($bit,$i,1);  
  140.     }  
  141.     for($k=0,$klen=16-count($bitArray);$k<$klen;$k++){  
  142.       array_unshift($bitArray,'0');  
  143.     }  
  144.     $bitArray=array_slice($bitArray,0,($leapMonth==0?12:13));  
  145.     for($i=0;$i<count($bitArray);$i++){  
  146.       $bitArray[$i]=$bitArray[$i] + 29;  
  147.     }  
  148.     return $bitArray;  
  149.   }  
  150.   /**  
  151.   * 获取农历每年的天数  
  152.   * @param year 农历年份  
  153.   */  
  154.   function getLunarYearDays($year){  
  155.     $yearData=$this->lunarInfo[$year-$this->MIN_YEAR];  
  156.     $monthArray=$this->getLunarYearMonths($year);  
  157.     $len=count($monthArray);  
  158.     return ($monthArray[$len-1]==0?$monthArray[$len-2]:$monthArray[$len-1]);  
  159.   }  
  160.   function getLunarYearMonths($year){//debugger;  
  161.     $monthData=$this->getLunarMonths($year);  
  162.     $res=array();  
  163.     $temp=0;  
  164.     $yearData=$this->lunarInfo[$year-$this->MIN_YEAR];  
  165.     $len=($yearData[0]==0?12:13);  
  166.     for($i=0;$i<$len;$i++){  
  167.       $temp=0;  
  168.       for($j=0;$j<=$i;$j++){  
  169.         $temp+=$monthData[$j];  
  170.       }  
  171.       array_push($res,$temp);  
  172.     }  
  173.     return $res;  
  174.   }  
  175.   /**  
  176.   * 获取闰月  
  177.   * @param year 阴历年份  
  178.   */  
  179.   function getLeapMonth($year){  
  180.     $yearData=$this->lunarInfo[$year-$this->MIN_YEAR];  
  181.     return $yearData[0];  
  182.   }  
  183.   /**  
  184.   * 计算阴历日期与正月初一相隔的天数  
  185.   * @param year  
  186.   * @param month  
  187.   * @param date  
  188.   */  
  189.   function getDaysBetweenLunar($year,$month,$date){  
  190.     $yearMonth=$this->getLunarMonths($year);  
  191.     $res=0;  
  192.     for($i=1;$i<$month;$i++){  
  193.       $res+=$yearMonth[$i-1];  
  194.     }  
  195.     $res+=$date-1;  
  196.     return $res;  
  197.   }  
  198.   /**  
  199.   * 计算2个阳历日期之间的天数  
  200.   * @param year 阳历年  
  201.   * @param cmonth  
  202.   * @param cdate  
  203.   * @param dmonth 阴历正月对应的阳历月份  
  204.   * @param ddate 阴历初一对应的阳历天数  
  205.   */  
  206.   function getDaysBetweenSolar($year,$cmonth,$cdate,$dmonth,$ddate){  
  207.     $a=mktime(0,0,0,$cmonth,$cdate,$year);  
  208.     $b=mktime(0,0,0,$dmonth,$ddate,$year);  
  209.     return ceil(($a-$b)/24/3600);  
  210.   }  
  211.   /**  
  212.   * 根据距离正月初一的天数计算阴历日期  
  213.   * @param year 阳历年  
  214.   * @param between 天数  
  215.   */  
  216.   function getLunarByBetween($year,$between){//debugger;  
  217.     $lunarArray=array();  
  218.     $yearMonth=array();  
  219.     $t=0;  
  220.     $e=0;  
  221.     $leapMonth=0;  
  222.     $m='';  
  223.     if($between==0){  
  224.       array_push($lunarArray,$year,'正月','初一');  
  225.       $t=1;  
  226.       $e=1;  
  227.     }else{  
  228.       $year=$between>0? $year : ($year-1);  
  229.       $yearMonth=$this->getLunarYearMonths($year);  
  230.       $leapMonth=$this->getLeapMonth($year);  
  231.       $between=$between>0?$between : ($this->getLunarYearDays($year)+$between);  
  232.       for($i=0;$i<13;$i++){  
  233.         if($between==$yearMonth[$i]){  
  234.           $t=$i+2;  
  235.           $e=1;  
  236.           break;  
  237.         }else if($between<$yearMonth[$i]){  
  238.           $t=$i+1;  
  239.           $e=$between-(emptyempty($yearMonth[$i-1])?0:$yearMonth[$i-1])+1;  
  240.           break;  
  241.         }  
  242.       }  
  243.       $m=($leapMonth!=0&&$t==$leapMonth+1)?('闰'.$this->getCapitalNum($t- 1,true)):$this->getCapitalNum(($leapMonth!=0&&$leapMonth+1<$t?($t-1):$t),true);  
  244.       array_push($lunarArray,$year,$m,$this->getCapitalNum($e,false));  
  245.     }  
  246.     array_push($lunarArray,$this->getLunarYearName($year));// 天干地支  
  247.     array_push($lunarArray,$t,$e);  
  248.     array_push($lunarArray,$this->getYearZodiac($year));// 12生肖  
  249.     array_push($lunarArray,$leapMonth);// 闰几月  
  250.     return $lunarArray;  
  251.   }  
  252.   /**  
  253.   * 获取数字的阴历叫法  
  254.   * @param num 数字  
  255.   * @param isMonth 是否是月份的数字  
  256.   */  
  257.   function getCapitalNum($num,$isMonth){  
  258.     $isMonth=$isMonth||false;  
  259.     $dateHash=array('0'=>'','1'=>'一','2'=>'二','3'=>'三','4'=>'四','5'=>'五','6'=>'六','7'=>'七','8'=>'八','9'=>'九','10'=>'十 ');  
  260.     $monthHash=array('0'=>'','1'=>'正月','2'=>'二月','3'=>'三月','4'=>'四月','5'=>'五月','6'=>'六月','7'=>'七月','8'=>'八月','9'=>'九月','10'=>'十月','11'=>'冬月','12'=>'腊月');  
  261.     $res='';  
  262.     if($isMonth){  
  263.       $res=$monthHash[$num];  
  264.     }else{  
  265.       if($num<=10){  
  266.         $res='初'.$dateHash[$num];  
  267.       }else if($num>10&&$num<20){  
  268.         $res='十'.$dateHash[$num-10];  
  269.       }else if($num==20){  
  270.         $res="二十";  
  271.       }else if($num>20&&$num<30){  
  272.         $res="廿".$dateHash[$num-20];  
  273.       }else if($num==30){  
  274.         $res="三十";  
  275.       }  
  276.     }  
  277.     return $res;  
  278.   }  

使用方法如下:

  1. <?php  
  2. header("Content-Type:text/html;charset=utf-8");  
  3. $lunar=new Lunar(); 
  4. $month=$lunar->convertSolarToLunar(2013,07,08);//将阳历转换为阴历  
  5. echo '<pre>';  
  6. print_r($month); 

打印结果如下:

  1. Array 
  2.     [0] => 2013 
  3.     [1] => 五月 
  4.     [2] => 三十 
  5.     [3] => 癸巳 
  6.     [4] => 5 
  7.     [5] => 30 
  8.     [6] => 蛇 
  9.     [7] => 0 
  10. )

Tags: php阳历阴历互转

分享到: