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

 更新时间:2015年10月30日 13:43  点击:1913

最近对阳历转阴历从而得到相应节日的算法这方面比较感兴趣,于是就在网上搜了一圈。不错,还算是找到一个比较不错的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,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;   } } 

使用方法如下:

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

打印结果如下:
Array
(
    [0] => 2013
    [1] => 五月
    [2] => 三十
    [3] => 癸巳
    [4] => 5
    [5] => 30
    [6] => 蛇
    [7] => 0
)

[!--infotagslink--]

相关文章

  • php 中file_get_contents超时问题的解决方法

    file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25
  • php语言实现redis的客户端

    php语言实现redis的客户端与服务端有一些区别了因为前面介绍过服务端了这里我们来介绍客户端吧,希望文章对各位有帮助。 为了更好的了解redis协议,我们用php来实现...2016-11-25
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • php抓取网站图片并保存的实现方法

    php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
  • jQuery+jRange实现滑动选取数值范围特效

    有时我们在页面上需要选择数值范围,如购物时选取价格区间,购买主机时自主选取CPU,内存大小配置等,使用直观的滑块条直接选取想要的数值大小即可,无需手动输入数值,操作简单又方便。HTML首先载入jQuery库文件以及jRange相关...2015-03-15
  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • ps把文字背景变透明的操作方法

    ps软件是现在非常受大家喜欢的一款软件,有着非常不错的使用功能。这次文章就给大家介绍下ps把文字背景变透明的操作方法,喜欢的一起来看看。 1、使用Photoshop软件...2017-07-06
  • intellij idea快速查看当前类中的所有方法(推荐)

    这篇文章主要介绍了intellij idea快速查看当前类中的所有方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-02
  • Mysql select语句设置默认值的方法

    1.在没有设置默认值的情况下: 复制代码 代码如下:SELECT userinfo.id, user_name, role, adm_regionid, region_name , create_timeFROM userinfoLEFT JOIN region ON userinfo.adm_regionid = region.id 结果:...2014-05-31
  • JS实现的简洁纵向滑动菜单(滑动门)效果

    本文实例讲述了JS实现的简洁纵向滑动菜单(滑动门)效果。分享给大家供大家参考,具体如下:这是一款纵向布局的CSS+JavaScript滑动门代码,相当简洁的手法来实现,如果对颜色不满意,你可以试着自己修改CSS代码,这个滑动门将每一...2015-10-21
  • js导出table数据到excel即导出为EXCEL文档的方法

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht...2013-10-13
  • mysql 批量更新与批量更新多条记录的不同值实现方法

    批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:复制代码 代码如下:UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';如果更新同一字段为同一个值,mysql也很简单,修改下where即...2013-10-04
  • ps怎么制作倒影 ps设计倒影的方法

    ps软件是一款非常不错的图片处理软件,有着非常不错的使用效果。这次文章要给大家介绍的是ps怎么制作倒影,一起来看看设计倒影的方法。 用ps怎么做倒影最终效果&#819...2017-07-06
  • js基础知识(公有方法、私有方法、特权方法)

    本文涉及的主题虽然很基础,在许多人看来属于小伎俩,但在JavaScript基础知识中属于一个综合性的话题。这里会涉及到对象属性的封装、原型、构造函数、闭包以及立即执行表达式等知识。公有方法 公有方法就是能被外部访问...2015-11-08
  • 安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法

    手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21
  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
  • c#中分割字符串的几种方法

    单个字符分割 string s="abcdeabcdeabcde"; string[] sArray=s.Split('c'); foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果: ab de...2020-06-25
  • js控制页面控件隐藏显示的两种方法介绍

    javascript控制页面控件隐藏显示的两种方法,方法的不同之处在于控件隐藏后是否还在页面上占位 方法一: 复制代码 代码如下: document.all["panelsms"].style.visibility="hidden"; document.all["panelsms"].style.visi...2013-10-13
  • 连接MySql速度慢的解决方法(skip-name-resolve)

    最近在Linux服务器上安装MySql5后,本地使用客户端连MySql速度超慢,本地程序连接也超慢。 解决方法:在配置文件my.cnf的[mysqld]下加入skip-name-resolve。原因是默认安装的MySql开启了DNS的反向解析。如果禁用的话就不能...2015-10-21
  • C#方法的总结详解

    本篇文章是对C#方法进行了详细的总结与介绍,需要的朋友参考下...2020-06-25