zl程序教程

您现在的位置是:首页 >  后端

当前栏目

php阴历-农历-转换类代码

PHP转换代码 农历 阴历
2023-06-13 09:14:32 时间

复制代码代码如下:


<?php
/**
*公农历转换(1912-2012)
*
*Usage:
*  //公历1983-10-5转农历
*  $lunar=newLunar();
*  $date=$lunar->getLar("1983-10-5",0);
*  echodate("Y-m-d",$date);
*  //农历1983-8-29转公历
*  $date=$lunar->getLar("1983-8-29",1);
*  echodate("Y-m-d",$date);
*
*@paramstring日期
*@paramint   日期历法
*     -0公历
*       1农历
*
*@returntimestamp

  
 这是一个国历与农历互相转的Unit.

 其中年份皆用民国年份,请自行转换(西元年-1911=民国年).
 ***************************************************************************
 *国农历对映表之说明:                                                    *
 ***************************************************************************
 * 前二数字=闰月月份,如果为13则没有闰月                             *
 * 第叁至第六数字=12个月之大小月之2进位码->10进位                     *
 * 例如:                                                                 *
 *      101010101010=2730                                              *
 *      1:代表大月(30天)0:代表小月(29天)==>1月大2月小3月大..   *
 * 第七位数字为闰月天数                                                  *
 *          0:没有闰月之天数                                           *
 *          1:闰月为小月(29天)                                         *
 *          2:闰月为大月(30天)                                         *
 * 最後2位数字代表阳历之1月1日与阴历之1月1日相差天数                     *
 ***************************************************************************
 这对映表只有民国一年至民国一百年,如不敷您的使用请按照上述之方式自行增加.

 这个程式没有判断您所输入之年,月,日是否正确,请自行判断.

 如果转换出来之农历的月份是闰月则传给您的值是***负数***
 如果农历要转换国历如果是闰月请输入***负数***

 此版本为FreeWare  Version:0.1
 您可以自行修改,但最好可以将修改过之程式Mail一份给我.
 如果您要用於商业用途,请mail给我告知您的用途及原因.

*/
classLunar{
  var$LMDay=array();
  var$InterMonth=0;
  var$InterMonthDays=0;
  var$SLRangeDay=0;

  var$SMDay=array(1=>31,28,31,30,31,30,31,31,30,31,30,31);
  var$LongLife=array(1=>
  "132637048","133365036","053365225","132900044","131386034","022778122",//6
  "132395041","071175231","131175050","132635038","052891127","131701046",//12
  "131748035","042741223","130694043","132391032","021327122","131175040",//18
  "061623129","133402047","133402036","051769125","131453044","130694034",//24
  "032158223","132350041","073213230","133221049","133402038","063466226",//30
  "132901045","131130035","042651224","130605043","132349032","023371121",//36
  "132709040","072901128","131738047","132901036","051333226","131210044",//42
  "132651033","031111223","131323042","082714130","133733048","131706038",//48
  "062794127","132741045","131206035","042734124","132647043","131318032",//54
  "033878120","133477039","071461129","131386047","132413036","051245126",//60
  "131197045","132637033","043405122","133365041","083413130","132900048",//66
  "132922037","062394227","132395046","131179035","042711124","132635043",//72
  "102855132","131701050","131748039","062804128","132742047","132359036",//78
  "051199126","131175045","131611034","031866122","133749040","081717130",//84
  "131452049","132742037","052413127","132350046","133222035","043477123",//90
  "133402042","133493031","021877121","131386039","072747128","130605048",//96
  "132349037","053243125","132709044","132890033");

  functiongetLar($date,$isLunar=1){
      list($year,$month,$day)=split("-",$date);
      if($isLunar==1)
          return$this->Lunar2Solar($year,$month,$day);
      else
          return$this->Solar2Lunar($year,$month,$day);
  }

  functionIsLeapYear($AYear){
    return($AYear%4==0)and(($AYear%100<>0)or($AYear%400==0));
  }

  functionCovertLunarMonth($magicno){
       $m=$magicno;
       for($i=12;$i>=1;$i--){
           $size=$m%2;
           if($size==0)
              $this->LMDay[$i]=29;
           else
              $this->LMDay[$i]=30;
           $m=floor($m/2);
       }
   }

   functionProcessMagicStr($yy){
        $yy=$yy-1911;
        $magicstr=$this->LongLife[$yy];
        $this->InterMonth=substr($magicstr,0,2);
        $LunarMonth=substr($magicstr,2,4);
        $this->CovertLunarMonth($LunarMonth);
        $dsize=substr($magicstr,6,1);
        switch($dsize){
             case0:
               $this->InterMonthDays=0;
               break;
             case1:
               $this->InterMonthDays=29;
               break;
             case2:
               $this->InterMonthDays=30;
               break;
        }
        $this->SLRangeDay=substr($magicstr,7,2);
   }

   functionDaysPerLunarMonth($LYear,$LMonth){
        $this->ProcessMagicStr($LYear);
        if($LMonth<0)
           return$this->InterMonthDays;
        else
           return$this->LMDay[$LMonth];
   }

   functionSolar2Lunar($SYear,$SMonth,$SDay){
        if(!(1912<=$SYear&&$SYear<=2012)){
           returnfalse;
        }
        $day=0;
        if($this->isLeapYear($SYear))
           $this->SMDay[2]=29;
        $this->ProcessMagicStr($SYear);
        if($SMonth==1)
           $day=$SDay;
        else{
           for($i=1;$i<=$SMonth-1;$i++)
               $day=$day+$this->SMDay[$i];
           $day=$day+$SDay;
        }
        if($day<=$this->SLRangeDay){
           $day=$day-$this->SLRangeDay;
           $this->processmagicstr($SYear-1);
           for($i=12;$i>=1;$i--){
               $day=$day+$this->LMDay[$i];
               if($day>0)
                  break;
           }
           $LYear=$SYear-1;
           $LMonth=$i;
           $LDay=$day;
        }else{
           $day=$day-$this->SLRangeDay;
           for($i=1;$i<=$this->InterMonth-1;$i++){
               $day=$day-$this->LMDay[$i];
               if($day<=0)
                  break;
           }
           if($day<=0){
              $LYear=$SYear;
              $LMonth=$i;
              $LDay=$day+$this->LMDay[$i];
           }else{
              $day=$day-$this->LMDay[$this->InterMonth];
              if($day<=0){
                 $LYear=$SYear;
                 $LMonth=$this->InterMonth;
                 $LDay=$day+$this->LMDay[$this->InterMonth];
              }else{
                 $this->LMDay[$this->InterMonth]=$this->InterMonthDays;
                 for($i=$this->InterMonth;$i<=12;$i++){
                     $day=$day-$this->LMDay[$i];
                     if($day<=0)
                        break;
                 }
                 if($i==$this->InterMonth)
                    $LMonth=0-$this->InterMonth;
                 else
                    $LMonth=$i;
                 $LYear=$SYear;
                 $LDay=$day+$this->LMDay[$i];
              }
           }
        }
        returnmktime(0,0,0,$LMonth,$LDay,$LYear);
   }

   functionLunar2Solar($LYear,$LMonth,$LDay){
        if(!(1912<=$LYear&&$LYear<=2012)){
           returnfalse;
        }
        $day=0;
        $SYear=$LYear;
        if($this->isLeapYear($SYear))
           $this->SMDay[2]=29;
        $this->processmagicstr($SYear);
        if($LMonth<0)
           $day=$this->LMDay[$this->InterMonth];
        if($LMonth<>1)
           for($i=1;$i<=$LMonth-1;$i++)
               $day=$day+$this->LMDay[$i];
        $day=$day+$LDay+$this->SLRangeDay;
        if(($this->InterMonth<>13)and($this->InterMonth<$LMonth))
           $day=$day+$this->InterMonthDays;
        for($i=1;$i<=12;$i++){
            $day=$day-$this->SMDay[$i];
            if($day<=0)
               break;
        }
        if($day>0){
           $SYear=$SYear+1;
           if($this->isLeapYear($SYear))
              $this->SMDay[2]=29;
           for($i=1;$i<=12;$i++){
               $day=$day-$this->SMDay[$i];
               if($day<=0)
                  break;
           }
        }
        $day=$day+$this->SMDay[$i];
        $SMonth=$i;
        $SDay=$day;
        returnmktime(0,0,0,$SMonth,$SDay,$SYear);
   }
}
?>


使用方法:
复制代码代码如下:

 $lunar=newLunar();
  $date=$lunar->getLar("1983-10-5",0);
  echodate("Y-m-d",$date);
  //农历1983-8-29转公历
  $date=$lunar->getLar("1983-8-29",1);
  echodate("Y-m-d",$date);


复制代码代码如下:
<?php
classLunar{
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)
);
/**
*将阳历转换为阴历
*@paramyear公历-年
*@parammonth公历-月
*@paramdate公历-日
*/
functionconvertSolarToLunar($year,$month,$date){
//debugger;
$yearData=$this->lunarInfo[$year-$this->MIN_YEAR];
if($year==$this->MIN_YEAR&&$month<=2&&$date<=9){
returnarray(1891,"正月","初一","辛卯",1,1,"兔");
}
return$this->getLunarByBetween($year,$this->getDaysBetweenSolar($year,$month,$date,$yearData[1],$yearData[2]));
}

functionconvertSolarMonthToLunar($year,$month){
$yearData=$this->lunarInfo[$year-$this->MIN_YEAR];
if($year==$this->MIN_YEAR&&$month<=2&&$date<=9){
returnarray(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;
}
/**
*将阴历转换为阳历
*@paramyear阴历-年
*@parammonth阴历-月,闰月处理:例如如果当年闰五月,那么第二个五月就传六月,相当于阴历有13个月,只是有的时候第13个月的天数为0
*@paramdate阴历-日
*/
functionconvertLunarToSolar($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];
returnarray($year,$month,$day);
}
/**
*判断是否是闰年
*@paramyear
*/
functionisLeapYear($year){
return(($year%4==0&&$year%100!=0)||($year%400==0));
}
/**
*获取干支纪年
*@paramyear
*/
functiongetLunarYearName($year){
$sky=array("庚","辛","壬","癸","甲","乙","丙","丁","戊","己");
$earth=array("申","酉","戌","亥","子","丑","寅","卯","辰","巳","午","未");
$year=$year."";
return$sky[$year{3}].$earth[$year%12];
}
/**
*根据阴历年获取生肖
*@paramyear阴历年
*/
functiongetYearZodiac($year){
$zodiac=array("猴","鸡","狗","猪","鼠","牛","虎","兔","龙","蛇","马","羊");
return$zodiac[$year%12];
}
/**
*获取阳历月份的天数
*@paramyear阳历-年
*@parammonth阳历-月
*/
functiongetSolarMonthDays($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"];
}
/**
*获取阴历月份的天数
*@paramyear阴历-年
*@parammonth阴历-月,从一月开始
*/
functiongetLunarMonthDays($year,$month){
$monthData=$this->getLunarMonths($year);
return$monthData[$month-1];
}
/**
*获取阴历每月的天数的数组
*@paramyear
*/
functiongetLunarMonths($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;
}
/**
*获取农历每年的天数
*@paramyear农历年份
*/
functiongetLunarYearDays($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]);
}
functiongetLunarYearMonths($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;
}
/**
*获取闰月
*@paramyear阴历年份
*/
functiongetLeapMonth($year){
$yearData=$this->lunarInfo[$year-$this->MIN_YEAR];
return$yearData[0];
}
/**
*计算阴历日期与正月初一相隔的天数
*@paramyear
*@parammonth
*@paramdate
*/
functiongetDaysBetweenLunar($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个阳历日期之间的天数
*@paramyear阳历年
*@paramcmonth
*@paramcdate
*@paramdmonth阴历正月对应的阳历月份
*@paramddate阴历初一对应的阳历天数
*/
functiongetDaysBetweenSolar($year,$cmonth,$cdate,$dmonth,$ddate){
$a=mktime(0,0,0,$cmonth,$cdate,$year);
$b=mktime(0,0,0,$dmonth,$ddate,$year);
returnceil(($a-$b)/24/3600);
}
/**
*根据距离正月初一的天数计算阴历日期
*@paramyear阳历年
*@parambetween天数
*/
functiongetLunarByBetween($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;
}elseif($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;
}
/**
*获取数字的阴历叫法
*@paramnum数字
*@paramisMonth是否是月份的数字
*/
functiongetCapitalNum($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];
}elseif($num>10&&$num<20){
$res="十".$dateHash[$num-10];
}elseif($num==20){
$res="二十";
}elseif($num>20&&$num<30){
$res="廿".$dateHash[$num-20];
}elseif($num==30){
$res="三十";
}
}
return$res;
}
}
$lunar=newLunar();
$month=$lunar->convertLunarToSolar(2012,1,1);
print_r($month);
exit;