php阳历转农历优化版

本文实例为大家分享了php阳历转农历代码,供大家参考,具体内容如下

<?php
 
	public function nongli($riqi){

	$nian=date('Y',strtotime($riqi));
	$yue=date('m',strtotime($riqi));
	$ri=date('d',strtotime($riqi));
	 
	#农历每月的天数 
	#数组第一个为当年闰月月份 后面十三个为农历每月天数(有闰月时有十三个) 最后两个为每年轮的天干(1-10)地支(1-12)
	$everymonth=array( 
		0=>array(8,0,0,0,0,0,0,0,0,0,0,0,29,30,7,1), 
		1=>array(0,29,30,29,29,30,29,30,29,30,30,30,29,0,8,2), 
		2=>array(0,30,29,30,29,29,30,29,30,29,30,30,30,0,9,3), 
		3=>array(5,29,30,29,30,29,29,30,29,29,30,30,29,30,10,4), 
		4=>array(0,30,30,29,30,29,29,30,29,29,30,30,29,0,1,5), 
		5=>array(0,30,30,29,30,30,29,29,30,29,30,29,30,0,2,6), 
		6=>array(4,29,30,30,29,30,29,30,29,30,29,30,29,30,3,7), 
		7=>array(0,29,30,29,30,29,30,30,29,30,29,30,29,0,4,8), 
		8=>array(0,30,29,29,30,30,29,30,29,30,30,29,30,0,5,9), 
		9=>array(2,29,30,29,29,30,29,30,29,30,30,30,29,30,6,10), 
		10=>array(0,29,30,29,29,30,29,30,29,30,30,30,29,0,7,11), 
		11=>array(6,30,29,30,29,29,30,29,29,30,30,29,30,30,8,12), 
		12=>array(0,30,29,30,29,29,30,29,29,30,30,29,30,0,9,1), 
		13=>array(0,30,30,29,30,29,29,30,29,29,30,29,30,0,10,2), 
		14=>array(5,30,30,29,30,29,30,29,30,29,30,29,29,30,1,3), 
		15=>array(0,30,29,30,30,29,30,29,30,29,30,29,30,0,2,4), 
		16=>array(0,29,30,29,30,29,30,30,29,30,29,30,29,0,3,5), 
		17=>array(2,30,29,29,30,29,30,30,29,30,30,29,30,29,4,6), 
		18=>array(0,30,29,29,30,29,30,29,30,30,29,30,30,0,5,7), 
		19=>array(7,29,30,29,29,30,29,29,30,30,29,30,30,30,6,8), 
		20=>array(0,29,30,29,29,30,29,29,30,30,29,30,30,0,7,9), 
		21=>array(0,30,29,30,29,29,30,29,29,30,29,30,30,0,8,10), 
		22=>array(5,30,29,30,30,29,29,30,29,29,30,29,30,30,9,11), 
		23=>array(0,29,30,30,29,30,29,30,29,29,30,29,30,0,10,12), 
		24=>array(0,29,30,30,29,30,30,29,30,29,30,29,29,0,1,1), 
		25=>array(4,30,29,30,29,30,30,29,30,30,29,30,29,30,2,2), 
		26=>array(0,29,29,30,29,30,29,30,30,29,30,30,29,0,3,3), 
		27=>array(0,30,29,29,30,29,30,29,30,29,30,30,30,0,4,4), 
		28=>array(2,29,30,29,29,30,29,29,30,29,30,30,30,30,5,5), 
		29=>array(0,29,30,29,29,30,29,29,30,29,30,30,30,0,6,6), 
		30=>array(6,29,30,30,29,29,30,29,29,30,29,30,30,29,7,7), 
		31=>array(0,30,30,29,30,29,30,29,29,30,29,30,29,0,8,8), 
		32=>array(0,30,30,30,29,30,29,30,29,29,30,29,30,0,9,9), 
		33=>array(5,29,30,30,29,30,30,29,30,29,30,29,29,30,10,10), 
		34=>array(0,29,30,29,30,30,29,30,29,30,30,29,30,0,1,11), 
		35=>array(0,29,29,30,29,30,29,30,30,29,30,30,29,0,2,12), 
		36=>array(3,30,29,29,30,29,29,30,30,29,30,30,30,29,3,1), 
		37=>array(0,30,29,29,30,29,29,30,29,30,30,30,29,0,4,2), 
		38=>array(7,30,30,29,29,30,29,29,30,29,30,30,29,30,5,3), 
		39=>array(0,30,30,29,29,30,29,29,30,29,30,29,30,0,6,4), 
		40=>array(0,30,30,29,30,29,30,29,29,30,29,30,29,0,7,5), 
		41=>array(6,30,30,29,30,30,29,30,29,29,30,29,30,29,8,6), 
		42=>array(0,30,29,30,30,29,30,29,30,29,30,29,30,0,9,7), 
		43=>array(0,29,30,29,30,29,30,30,29,30,29,30,29,0,10,8), 
		44=>array(4,30,29,30,29,30,29,30,29,30,30,29,30,30,1,9), 
		45=>array(0,29,29,30,29,29,30,29,30,30,30,29,30,0,2,10), 
		46=>array(0,30,29,29,30,29,29,30,29,30,30,29,30,0,3,11), 
		47=>array(2,30,30,29,29,30,29,29,30,29,30,29,30,30,4,12), 
		48=>array(0,30,29,30,29,30,29,29,30,29,30,29,30,0,5,1), 
		49=>array(7,30,29,30,30,29,30,29,29,30,29,30,29,30,6,2), 
		50=>array(0,29,30,30,29,30,30,29,29,30,29,30,29,0,7,3), 
		51=>array(0,30,29,30,30,29,30,29,30,29,30,29,30,0,8,4), 
		52=>array(5,29,30,29,30,29,30,29,30,30,29,30,29,30,9,5), 
		53=>array(0,29,30,29,29,30,30,29,30,30,29,30,29,0,10,6), 
		54=>array(0,30,29,30,29,29,30,29,30,30,29,30,30,0,1,7), 
		55=>array(3,29,30,29,30,29,29,30,29,30,29,30,30,30,2,8), 
		56=>array(0,29,30,29,30,29,29,30,29,30,29,30,30,0,3,9), 
		57=>array(8,30,29,30,29,30,29,29,30,29,30,29,30,29,4,10), 
		58=>array(0,30,30,30,29,30,29,29,30,29,30,29,30,0,5,11), 
		59=>array(0,29,30,30,29,30,29,30,29,30,29,30,29,0,6,12), 
		60=>array(6,30,29,30,29,30,30,29,30,29,30,29,30,29,7,1), 
		61=>array(0,30,29,30,29,30,29,30,30,29,30,29,30,0,8,2), 
		62=>array(0,29,30,29,29,30,29,30,30,29,30,30,29,0,9,3), 
		63=>array(4,30,29,30,29,29,30,29,30,29,30,30,30,29,10,4), 
		64=>array(0,30,29,30,29,29,30,29,30,29,30,30,30,0,1,5), 
		65=>array(0,29,30,29,30,29,29,30,29,29,30,30,29,0,2,6), 
		66=>array(3,30,30,30,29,30,29,29,30,29,29,30,30,29,3,7), 
		67=>array(0,30,30,29,30,30,29,29,30,29,30,29,30,0,4,8), 
		68=>array(7,29,30,29,30,30,29,30,29,30,29,30,29,30,5,9), 
		69=>array(0,29,30,29,30,29,30,30,29,30,29,30,29,0,6,10), 
		70=>array(0,30,29,29,30,29,30,30,29,30,30,29,30,0,7,11), 
		71=>array(5,29,30,29,29,30,29,30,29,30,30,30,29,30,8,12), 
		72=>array(0,29,30,29,29,30,29,30,29,30,30,29,30,0,9,1), 
		73=>array(0,30,29,30,29,29,30,29,29,30,30,29,30,0,10,2), 
		74=>array(4,30,30,29,30,29,29,30,29,29,30,30,29,30,1,3), 
		75=>array(0,30,30,29,30,29,29,30,29,29,30,29,30,0,2,4), 
		76=>array(8,30,30,29,30,29,30,29,30,29,29,30,29,30,3,5), 
		77=>array(0,30,29,30,30,29,30,29,30,29,30,29,29,0,4,6), 
		78=>array(0,30,29,30,30,29,30,30,29,30,29,30,29,0,5,7), 
		79=>array(6,30,29,29,30,29,30,30,29,30,30,29,30,29,6,8), 
		80=>array(0,30,29,29,30,29,30,29,30,30,29,30,30,0,7,9), 
		81=>array(0,29,30,29,29,30,29,29,30,30,29,30,30,0,8,10), 
		82=>array(4,30,29,30,29,29,30,29,29,30,29,30,30,30,9,11), 
		83=>array(0,30,29,30,29,29,30,29,29,30,29,30,30,0,10,12), 
		84=>array(10,30,29,30,30,29,29,30,29,29,30,29,30,30,1,1), 
		85=>array(0,29,30,30,29,30,29,30,29,29,30,29,30,0,2,2), 
		86=>array(0,29,30,30,29,30,30,29,30,29,30,29,29,0,3,3), 
		87=>array(6,30,29,30,29,30,30,29,30,30,29,30,29,29,4,4), 
		88=>array(0,30,29,30,29,30,29,30,30,29,30,30,29,0,5,5), 
		89=>array(0,30,29,29,30,29,29,30,30,29,30,30,30,0,6,6), 
		90=>array(5,29,30,29,29,30,29,29,30,29,30,30,30,30,7,7), 
		91=>array(0,29,30,29,29,30,29,29,30,29,30,30,30,0,8,8), 
		92=>array(0,29,30,30,29,29,30,29,29,30,29,30,30,0,9,9), 
		93=>array(3,29,30,30,29,30,29,30,29,29,30,29,30,29,10,10), 
		94=>array(0,30,30,30,29,30,29,30,29,29,30,29,30,0,1,11), 
		95=>array(8,29,30,30,29,30,29,30,30,29,29,30,29,30,2,12), 
		96=>array(0,29,30,29,30,30,29,30,29,30,30,29,29,0,3,1), 
		97=>array(0,30,29,30,29,30,29,30,30,29,30,30,29,0,4,2), 
		98=>array(5,30,29,29,30,29,29,30,30,29,30,30,29,30,5,3), 
		99=>array(0,30,29,29,30,29,29,30,29,30,30,30,29,0,6,4), 
		100=>array(0,30,30,29,29,30,29,29,30,29,30,30,29,0,7,5), 
		101=>array(4,30,30,29,30,29,30,29,29,30,29,30,29,30,8,6), 
		102=>array(0,30,30,29,30,29,30,29,29,30,29,30,29,0,9,7), 
		103=>array(0,30,30,29,30,30,29,30,29,29,30,29,30,0,10,8), 
		104=>array(2,29,30,29,30,30,29,30,29,30,29,30,29,30,1,9), 
		105=>array(0,29,30,29,30,29,30,30,29,30,29,30,29,0,2,10), 
		106=>array(7,30,29,30,29,30,29,30,29,30,30,29,30,30,3,11), 
		107=>array(0,29,29,30,29,29,30,29,30,30,30,29,30,0,4,12), 
		108=>array(0,30,29,29,30,29,29,30,29,30,30,29,30,0,5,1), 
		109=>array(5,30,30,29,29,30,29,29,30,29,30,29,30,30,6,2), 
		110=>array(0,30,29,30,29,30,29,29,30,29,30,29,30,0,7,3), 
		111=>array(0,30,29,30,30,29,30,29,29,30,29,30,29,0,8,4), 
		112=>array(4,30,29,30,30,29,30,29,30,29,30,29,30,29,9,5), 
		113=>array(0,30,29,30,29,30,30,29,30,29,30,29,30,0,10,6), 
		114=>array(9,29,30,29,30,29,30,29,30,30,29,30,29,30,1,7), 
		115=>array(0,29,30,29,29,30,29,30,30,30,29,30,29,0,2,8), 
		116=>array(0,30,29,30,29,29,30,29,30,30,29,30,30,0,3,9), 
		117=>array(6,29,30,29,30,29,29,30,29,30,29,30,30,30,4,10), 
		118=>array(0,29,30,29,30,29,29,30,29,30,29,30,30,0,5,11), 
		119=>array(0,30,29,30,29,30,29,29,30,29,29,30,30,0,6,12), 
		120=>array(4,29,30,30,30,29,30,29,29,30,29,30,29,30,7,1),
		121=>array(0,29,30,30,29,30,29,30,29,30,29,30,29,0,8,2),
																//2022
	); 
	############################## 
		#农历天干 
		$mten=array("null","甲","乙","丙","丁","戊","己","庚","辛","壬","癸"); 
		#农历地支 
		$mtwelve=array("null","子(鼠)","丑(牛)","寅(虎)","卯(兔)","辰(龙)","巳(蛇)","午(马)","未(羊)","申(猴)","酉(鸡)","戌(狗)","亥(猪)"); 
		#农历月份 
		$mmonth=array("闰","正","二","三","四","五","六","七","八","九","十","十一","十二","月"); 
		#农历日 
		$mday=array("null","初一","初二","初三","初四","初五","初六","初七","初八","初九","初十","十一","十二","十三","十四","十五","十六","十七","十八","十九","二十","廿一","廿二","廿三","廿四","廿五","廿六","廿七","廿八","廿九","三十"); 
	############################## 
		#星期 
		$weekday = array("星期日","星期一","星期二","星期三","星期四","星期五","星期六"); 
		#阳历总天数 至1900年12月21日 
		$total=11;
		#阴历总天数 
		$mtotal=0; 
	############################## 
		#获得当日日期 
		//$today=getdate();  //获取今天的日期
		if($nian<1901 || $nian>2021) die("年份出错!"); 
		//$cur_wday=$today["wday"]; //星期中第几天的数字表示
		for($y=1901;$y<$nian;$y++) { //计算到所求日期阳历的总天数-自1900年12月21日始,先算年的和 
		   $total+=365;
		   if ($y%4==0) $total++; 
		}
	  
		switch($yue) { //再加当年的几个月 
			case 12: 
				$total+=30; 
			case 11: 
				$total+=31; 
			case 10: 
				$total+=30; 
			case 9: 
				$total+=31; 
			case 8: 
				$total+=31; 
			case 7: 
				$total+=30; 
			case 6: 
				$total+=31; 
			case 5: 
				$total+=30; 
			case 4: 
				$total+=31;
			case 3: 
				$total+=28;//2月总天数
			case 2: 
				$total+=31;//1月总天数
		}
		
		if($nian%4 == 0 && $yue>2) $total++; //如果当年是闰年月份大于2月时还要多加一天 2月29天
		$total=$total+$ri-1; //加当月的天数 
		$flag1=0;  //判断跳出循环的条件 
		$j=0; 

		while ($j<=121){  //用农历的天数累加来判断是否超过阳历的天数 
			$i=1;
			while ($i<=13){
				$mtotal+=$everymonth[$j][$i];
				if ($mtotal>=$total){
					$flag1=1;
					break;
				}
				$i++;
			}
			if ($flag1==1) break;
			$j++;
		}
		
		if($everymonth[$j][0]<>0 and $everymonth[$j][0]<$i){ //原来错在这里,对闰月没有修补 
			$mm=$i-1;
		}else{ 
			$mm=$i;
		}

		if($i==$everymonth[$j][0]+1 and $everymonth[$j][0]<>0) { 
			$nlmon=$mmonth[0].$mmonth[$mm].$mmonth[13];#闰月 
		} else {
			$nlmon=$mmonth[$mm].$mmonth[13]; 
		} 
		/*
	 	print_r('|'.$j.'-'.$i.'|');
		print_r($total.'|');
		print_r($mtotal.'|');
		print_r($mm.'|');
		*/
		#计算所求月份1号的农历日期 
		$md=$everymonth[$j][$i]-($mtotal-$total);
		//print_r($md);
		
		if($md > $everymonth[$j][$i]){
			$md-=$everymonth[$j][$i]; 
		}
		
		$nlday=$mday[$md]; 
		
		//$nowday=date("Y年n月j日 ")."w".$weekday[$cur_wday]." ".$mten[$everymonth[$j][14]].$mtwelve[$everymonth[$j][15]]."年".$nlmon.$nlday; 
		//$nowday=$mten[$everymonth[$j][14]].$mtwelve[$everymonth[$j][15]]."年 ".$nlmon.$nlday; 
		$nowday=$nian."年".$nlmon.$nlday;
		return $nowday;
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值