php阴历-农历-转换类代码
<?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;
相关文章
- C# 隐式转换_php隐式转换
- php格式怎么转换为pdf,PHP如何将将word文件转为pdf
- Windows 下 php-sendmail 配置实现
- [PHP] apache在worker模式配置fastcgi使用php-fpm详解编程语言
- PHP异步MySQL:提升网站性能的新方案(php异步mysql)
- PHP实现计算器
- PHP专业连接MySQL:实现快速代码.(php连接mysql数据库代码)
- PHP与Redis出色的结合(php连redis)
- Linux环境下,如何高效、简单地编写PHP代码(linux下写php)
- 「PHP Redis手册:高效有力的操作指南」(php的redis手册)
- PHP中使用Redis缓存数据的优势(php使用redis)
- Linux 环境下验证 PHP性能(linux验证php)
- 使用PHP操作MySQL数据库的基础——mysql类库(mysql类库php)
- PHP和Redis一起使用,如何充分利用64位操作系统的优势?(phpredis64)
- Redis在PHP环境下的安装与下载(redis下载 php)
- PHP与MSSQL的快速无缝连接配置指南(php链接mssql配置)
- 解决办法:使用PHP支持MSSQL扩展操作(php支持mssql扩展)
- 服务器深入比较:PHP数据库与MSSQL服务器(php数据库和mssql)
- PHP如何操作MSSQL数据库(php怎样使用mssql)
- PHP迅雷、快车、旋风下载专用链转换代码
- php简单对象与数组的转换函数代码(php多层数组和对象的转换)
- php学习之数据类型之间的转换代码
- php入门学习知识点三PHP上传
- php中英文语言转换类代码
- 用PHP实现小写金额转换大写金额的代码(精确到分)
- PHP图片处理类phpThumb参数用法介绍
- PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
- php实现utf-8和GB2312编码相互转换函数代码
- PHP转换文件夹下所有文件编码的实现代码
- PHP英文字母大小写转换函数小结
- PHP函数strip_tags的一个bug浅析