0

0

php阳历转阴历(农历),阴历转阳历(新历)的方法

php中文网

php中文网

发布时间:2016-06-20 13:00:29

|

1476人浏览过

|

来源于php中文网

原创

由于最近一个项目设计到将阳历转阴历从而得到相应节日的算法,对这方面不是很了解,于是就在网上搜了一圈。不错,还算是找到一个比较不错的php类,实现了将阳历转换为阴历(农历),阴历转换为阳历的算法(新历),同时还能获取干支纪年,生肖,以及相应的阴历的中文叫法等等,功能还是挺齐全的,在这里共享一下。

具体类代码如下:

Cognitive Mill
Cognitive Mill

一个云计算平台,可以分析视频并自动生成预告片

下载
<p>class Lunar{</p>	var $MIN_YEAR=1891;<br>	var $MAX_YEAR=2100;<br>	var $lunarInfo=array(<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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),<br>		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)<br>	);<br>	/** <br>	* 将阳历转换为阴历 <br>	* @param year 公历-年 <br>	* @param month 公历-月 <br>	* @param date 公历-日 <br>	*/ <br>	function convertSolarToLunar($year,$month,$date){//debugger;<br>		$yearData=$this->lunarInfo[$year-$this->MIN_YEAR];<br>		if($year==$this->MIN_YEAR&&$month<=2&&$date<=9){ <br>			return array(1891,'正月','初一','辛卯',1,1,'兔');<br>		}<br>		return $this->getLunarByBetween($year,$this->getDaysBetweenSolar($year,$month,$date,$yearData[1],$yearData[2]));<br>	}<br>	function convertSolarMonthToLunar($year,$month){<br>		$yearData=$this->lunarInfo[$year-$this->MIN_YEAR];<br>		if($year==$this->MIN_YEAR&&$month<=2&&$date<=9){ <br>			return array(1891,'正月','初一','辛卯',1,1,'兔');<br>		}<br>		$month_days_ary=array(31,28,31,30,31,30,31,31,30,31,30,31);<br>		$dd=$month_days_ary[$month];<br>		if($this->isLeapYear($year)&& $month==2)$dd++;<br>		$lunar_ary=array();<br>		for ($i=1;$i<$dd;$i++){<br>			$array=$this->getLunarByBetween($year,$this->getDaysBetweenSolar($year,$month,$i,$yearData[1],$yearData[2]));<br>			$array[]=$year.'-'.$month.'-'.$i;<br>			$lunar_ary[$i]=$array;<br>		}<br>		return $lunar_ary;<br>	}<br>	/** <br>	* 将阴历转换为阳历 <br>	* @param year 阴历-年 <br>	* @param month 阴历-月,闰月处理:例如如果当年闰五月,那么第二个五月就传六月,相当于阴历有13个月,只是有的时候第13个月的天数为0 <br>	* @param date 阴历-日 <br>	*/ <br>	function convertLunarToSolar($year,$month,$date){ <br>		$yearData=$this->lunarInfo[$year-$this->MIN_YEAR];<br>		$between=$this->getDaysBetweenLunar($year,$month,$date);<br>		$res=mktime(0,0,0,$yearData[1],$yearData[2],$year);<br>		$res=date('Y-m-d',$res+$between*24*60*60);<br>		$day=explode('-',$res);<br>		$year=$day[0];<br>		$month=$day[1];<br>		$day=$day[2];<br>		return array($year,$month,$day);<br>	}<br>	/** <br>	* 判断是否是闰年 <br>	* @param year <br>	*/ <br>	function isLeapYear($year){ <br>		return (($year%4==0&&$year%100!=0)||($year%400==0));<br>	}<br>	/** <br>	* 获取干支纪年 <br>	* @param year <br>	*/ <br>	function getLunarYearName($year){ <br>		$sky=array('庚','辛','壬','癸','甲','乙','丙','丁','戊','己');<br>		$earth=array('申','酉','戌','亥','子','丑','寅','卯','辰','巳','午','未');<br>		$year=$year.'';<br>		return $sky[$year{3}].$earth[$year%12];<br>	}<br>	/** <br>	* 根据阴历年获取生肖 <br>	* @param year 阴历年 <br>	*/ <br>	function getYearZodiac($year){ <br>		$zodiac=array('猴','鸡','狗','猪','鼠','牛','虎','兔','龙','蛇','马','羊');<br>		return $zodiac[$year%12];<br>	}<br>	/** <br>	* 获取阳历月份的天数 <br>	* @param year 阳历-年 <br>	* @param month 阳历-月 <br>	*/ <br>	function getSolarMonthDays($year,$month){ <br>		$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);<br>		return $monthHash["$month"];<br>	}<br>	/** <br>	* 获取阴历月份的天数 <br>	* @param year 阴历-年 <br>	* @param month 阴历-月,从一月开始 <br>	*/ <br>	function getLunarMonthDays($year,$month){ <br>		$monthData=$this->getLunarMonths($year);<br>		return $monthData[$month-1];<br>	}<br>	/** <br>	* 获取阴历每月的天数的数组 <br>	* @param year <br>	*/ <br>	function getLunarMonths($year){ <br>		$yearData=$this->lunarInfo[$year-$this->MIN_YEAR];<br>		$leapMonth=$yearData[0];<br>		$bit=decbin($yearData[3]);<br>		for ($i=0;$i<strlen($bit);$i ++){<br>			$bitArray[$i]=substr($bit,$i,1);<br>		}<br>		for($k=0,$klen=16-count($bitArray);$k<$klen;$k++){ <br>			array_unshift($bitArray,'0');<br>		}<br>		$bitArray=array_slice($bitArray,0,($leapMonth==0?12:13));<br>		for($i=0;$i<count($bitArray);$i++){ <br>			$bitArray[$i]=$bitArray[$i] + 29;<br>		}<br>		return $bitArray;<br>	}<br>	/** <br>	* 获取农历每年的天数 <br>	* @param year 农历年份 <br>	*/ <br>	function getLunarYearDays($year){ <br>		$yearData=$this->lunarInfo[$year-$this->MIN_YEAR];<br>		$monthArray=$this->getLunarYearMonths($year);<br>		$len=count($monthArray);<br>		return ($monthArray[$len-1]==0?$monthArray[$len-2]:$monthArray[$len-1]);<br>	}<br>	function getLunarYearMonths($year){//debugger;<br>		$monthData=$this->getLunarMonths($year);<br>		$res=array();<br>		$temp=0;<br>		$yearData=$this->lunarInfo[$year-$this->MIN_YEAR];<br>		$len=($yearData[0]==0?12:13);<br>		for($i=0;$i<$len;$i++){ <br>			$temp=0;<br>			for($j=0;$j<=$i;$j++){ <br>				$temp+=$monthData[$j];<br>			}<br>			array_push($res,$temp);<br>		}<br>		return $res;<br>	}<br>	/** <br>	* 获取闰月 <br>	* @param year 阴历年份 <br>	*/ <br>	function getLeapMonth($year){ <br>		$yearData=$this->lunarInfo[$year-$this->MIN_YEAR];<br>		return $yearData[0];<br>	}<br>	/** <br>	* 计算阴历日期与正月初一相隔的天数 <br>	* @param year http://www.phpernote.com/<br>	* @param month <br>	* @param date <br>	*/ <br>	function getDaysBetweenLunar($year,$month,$date){ <br>		$yearMonth=$this->getLunarMonths($year);<br>		$res=0;<br>		for($i=1;$i<$month;$i++){ <br>			$res+=$yearMonth[$i-1];<br>		}<br>		$res+=$date-1;<br>		return $res;<br>	}<br>	/** <br>	* 计算2个阳历日期之间的天数 <br>	* @param year 阳历年 <br>	* @param cmonth <br>	* @param cdate <br>	* @param dmonth 阴历正月对应的阳历月份 <br>	* @param ddate 阴历初一对应的阳历天数 <br>	*/ <br>	function getDaysBetweenSolar($year,$cmonth,$cdate,$dmonth,$ddate){ <br>		$a=mktime(0,0,0,$cmonth,$cdate,$year);<br>		$b=mktime(0,0,0,$dmonth,$ddate,$year);<br>		return ceil(($a-$b)/24/3600);<br>	}<br>	/** <br>	* 根据距离正月初一的天数计算阴历日期 <br>	* @param year 阳历年 <br>	* @param between 天数 <br>	*/ <br>	function getLunarByBetween($year,$between){//debugger;<br>		$lunarArray=array();<br>		$yearMonth=array();<br>		$t=0;<br>		$e=0;<br>		$leapMonth=0;<br>		$m='';<br>		if($between==0){ <br>			array_push($lunarArray,$year,'正月','初一');<br>			$t=1;<br>			$e=1;<br>		}else{ <br>			$year=$between>0? $year : ($year-1);<br>			$yearMonth=$this->getLunarYearMonths($year);<br>			$leapMonth=$this->getLeapMonth($year);<br>			$between=$between>0?$between : ($this->getLunarYearDays($year)+$between);<br>			for($i=0;$i<13;$i++){ <br>				if($between==$yearMonth[$i]){ <br>					$t=$i+2;<br>					$e=1;<br>					break;<br>				}else if($between<$yearMonth[$i]){ <br>					$t=$i+1;<br>					$e=$between-(empty($yearMonth[$i-1])?0:$yearMonth[$i-1])+1;<br>					break;<br>				}<br>			}<br>			$m=($leapMonth!=0&&$t==$leapMonth+1)?('闰'.$this->getCapitalNum($t- 1,true)):$this->getCapitalNum(($leapMonth!=0&&$leapMonth+1<$t?($t-1):$t),true);<br>			array_push($lunarArray,$year,$m,$this->getCapitalNum($e,false));<br>		}<br>		array_push($lunarArray,$this->getLunarYearName($year));// 天干地支 <br>		array_push($lunarArray,$t,$e);<br>		array_push($lunarArray,$this->getYearZodiac($year));// 12生肖 <br>		array_push($lunarArray,$leapMonth);// 闰几月 <br>		return $lunarArray;<br>	}<br>	/** <br>	* 获取数字的阴历叫法 <br>	* @param num 数字 <br>	* @param isMonth 是否是月份的数字 <br>	*/ <br>	function getCapitalNum($num,$isMonth){ <br>		$isMonth=$isMonth||false;<br>		$dateHash=array('0'=>'','1'=>'一','2'=>'二','3'=>'三','4'=>'四','5'=>'五','6'=>'六','7'=>'七','8'=>'八','9'=>'九','10'=>'十 ');<br>		$monthHash=array('0'=>'','1'=>'正月','2'=>'二月','3'=>'三月','4'=>'四月','5'=>'五月','6'=>'六月','7'=>'七月','8'=>'八月','9'=>'九月','10'=>'十月','11'=>'冬月','12'=>'腊月');<br>		$res='';<br>		if($isMonth){ <br>			$res=$monthHash[$num];<br>		}else{ <br>			if($num<=10){ <br>				$res='初'.$dateHash[$num];<br>			}else if($num>10&&$num<20){ <br>				$res='十'.$dateHash[$num-10];<br>			}else if($num==20){ <br>				$res="二十";<br>			}else if($num>20&&$num<30){ <br>				$res="廿".$dateHash[$num-20];<br>			}else if($num==30){ <br>				$res="三十";<br>			}<br>		}<br>		return $res;<br>	}<br><p>}</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/7fc7563c4182" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">PHP免费学习笔记(深入)</a>”;</p>

使用方法如下:

<p><?php</p>header("Content-Type:text/html;charset=utf-8");<br>$lunar=new Lunar();//http://www.scutephp.com/<br>$month=$lunar->convertSolarToLunar(2013,07,08);//将阳历转换为阴历<br>echo '<pre class="brush:php;toolbar:false;">';<br><p>print_r($month);</p>

打印结果如下:

Array

(
    [0] => 2013
    [1] => 五月
    [2] => 三十
    [3] => 癸巳
    [4] => 5
    [5] => 30
    [6] => 蛇
    [7] => 0
)


相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

705

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

233

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

117

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

22

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

61

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

30

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

669

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

58

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP函数之array数组函数视频讲解
PHP函数之array数组函数视频讲解

共76课时 | 26.2万人学习

AngularJS教程
AngularJS教程

共24课时 | 3.7万人学习

CSS3实现按钮特效视频教程
CSS3实现按钮特效视频教程

共15课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号