文章分享一个简单的常用的实例就是关于php农历转阳历实现代码,有需要的同学可以参考一下下哈。
代码如下 复制代码
lunarinfo[$year-$this->min_year];
if($year==$this->min_year&&$monthreturn 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&&$monthreturn 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 $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 $bitarray[$i] = substr($bit, $i, 1);
}
for($k=0,$klen=16-count($bitarray);$karray_unshift($bitarray, '0');
}
$bitarray = array_slice($bitarray,0,($leapmonth==0?12:13));
for($i=0; $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$temp=0;
for($j=0;$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$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;$iif($between==$yearmonth[$i]){
$t=$i+2;
$e=1;
break;
}else if($between$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+1array_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$res = '初'.$datehash[$num];
}else if($num>10&&$num$res = '十'.$datehash[$num-10];
}else if($num==20){
$res = 二十;
}else if($num>20&&$num$res = 廿.$datehash[$num-20];
}else if($num==30){
$res = 三十;
}
}
return $res;
}
}
$lunar = new lunar();
$month = $lunar->convertlunartosolar(2012, 1,1);
print_r($month);
exit;
本文地址:
转载随意,但请附上文章地址:-)