文档章节

PHP实现阳历(新历)与阴历(农历)互相转换

张学良友
 张学良友
发布于 2017/09/12 09:19
字数 1590
阅读 4
收藏 0
点赞 0
评论 0

使用方法:

<?php
header("Content-Type:text/html;charset=utf-8");
require "lunar.php";
$lunar=new Lunar();
$month=$lunar--->convertSolarToLunar(2015,02,15);//将阳历转换为阴历
echo '<pre>';
print_r($month);
?>

输出结果:

Array
(
    [0] => 2014
    [1] => 腊月
    [2] => 廿六
    [3] => 甲午
    [4] => 13
    [5] => 26		
    [6] => 马		
    [7] => 9	
)

 

<?php
class Lunar{
	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)
	);
	/** 
	* 将阳历转换为阴历 
	* @param year 公历-年 
	* @param month 公历-月 
	* @param date 公历-日 
	*/ 
	function convertSolarToLunar($year,$month,$date){//debugger;
		$yearData=$this->lunarInfo[$year-$this->MIN_YEAR];
		if($year==$this->MIN_YEAR&&$month<=2&&$date<=9){ 
			return 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&&$month<=2&&$date<=9){ 
			return 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<$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;
	}
	/** 
	* 将阴历转换为阳历 
	* @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<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;
	}
	/** 
	* 获取农历每年的天数 
	* @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<$len;$i++){ 
			$temp=0;
			for($j=0;$j<=$i;$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 http://www.codetc.com/
	* @param month 
	* @param date 
	*/ 
	function getDaysBetweenLunar($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个阳历日期之间的天数 
	* @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;$i<13;$i++){ 
				if($between==$yearMonth[$i]){ 
					$t=$i+2;
					$e=1;
					break;
				}else if($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;
	}
	/** 
	* 获取数字的阴历叫法 
	* @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<=10){ 
				$res='初'.$dateHash[$num];
			}else if($num>10&&$num<20){ 
				$res='十'.$dateHash[$num-10];
			}else if($num==20){ 
				$res="二十";
			}else if($num>20&&$num<30){ 
				$res="廿".$dateHash[$num-20];
			}else if($num==30){ 
				$res="三十";
			}
		}
		return $res;
	}
}
?>

 

 

 

 

本文转载自:

共有 人打赏支持
张学良友
粉丝 0
博文 12
码字总数 974
作品 0
长沙
如何利用自定义函数把阳历转换成阴历

数据库保存的是阳历日期,有时候会遇到把阳历换成阴历的需求,例如下图把阳历转换成阴历。 这个问题是我在开发报表过程中遇到的一个小需求,利用的工具是FineReport8.0版本,解决思路是首先定...

技术小阿哥
2017/11/27
0
0
公历农历转换

公历(阳历)农历(阴历)转换,支持时间段从1900-2100 支持各种编程语言 C#,java,Objective-C,php,Python,javascript(nodejs),C/C++,ruby等 支持Mac,Windows,Android,WP多种平台 数据验证 1....

meizhitu
2015/01/16
1K
1
php阳历转阴历(农历),阴历转阳历的方法

<?php header ( "Content-Type: text/html; charset=utf-8" ); class Lunar{ var $MIN_YEAR=1891; var $MAX_YEAR=2100; var $lunarInfo=array( array(0,2,9,21936),array(6,1,30,9656),array......

jslthg
2014/04/02
0
0
有农历的日历

日历demo,可以显示阳历和阴历,显示范围是1900年到2100年。左右滑动手势切换月份,标题点击出现年份和月份选择器,“今天”按钮返回当日,每天日期均可点击(接口已经预留),“今天”的lab...

红薯
2013/09/05
1K
0
看到百度的那个万年历了吗,咱们也来做一个吧。

原创声明,转载请注明出处。 咱先来看看具体效果吧, https://dorsey.oss-cn-hangzhou.aliyuncs.com/PC/module/module/calendar.html 细心的你会发现好像只有这一天是初几,没有月份,嗯是的...

dorseyCh
07/11
0
0
寿星天文历的 C++ 实现版本 - sxtwl_cpp

项目背景 在公司一次下午茶的偶然的聊天,有位同事说如果有软件能够获取古代农历来研究古人八字就好了。然后,我就找了网上基本上所有和农历相关的的软件,其中包括ubuntu kylin的[优客农历]...

元谷
2017/05/20
0
0
谈谈历法知识

新春期间,我忍不住又想到了一个老问题: 为什么每年春节的日期都不一样? 从2007年到2010年,春节的日期分别为2月18日、2月7日、1月26日、2月14日和2月3日。为什么会这样?到底是怎么计算的...

阮一峰
2009/01/26
0
0
Linux桌面日历--KCalendar

KCalendar 允许被嵌入到你的 Linux 桌面,并支持显示包括农历日期、24 节气、农历节日、农历生日、阳历生日、阳历节日、阳历纪念日、周节日等在内的各种内容,尤其适合咱中文用户使用。 KCal...

匿名
2009/01/19
3.4K
0
linux上的农历插件

农历是中国目前与格里历(即公历)并行使用的一种历法,人们习称“阴历”,是阴阳历的一种。 有些时候我们可能需要查询农历和公历并进行转换,虽然有在线日历,但是因为和系统集成度不高,且...

红薯
2010/06/19
1K
1
日本的阳历转化阴历的算法(java)

求日本的阳历转化阴历的算法(java);网上没有找到,希望高手能帮下忙。

song2010
2011/10/13
502
4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SmartyGit安装及拉取rf代码

SmartyGit安装及拉取rf代码 一:生成ssh keys 下载安装包:Git Bash(Git-1.8.3-preview20130601.exe) 安装完成后打开Git Bash,安装流程如下: 在如下图位置找到Git Bash,运行Git Bash在其命...

舒文joven
11分钟前
0
0
Duang,HUAWEI DevEco IDE全面升级啦

想感受全新UI带来的视觉及交互体验、 HiKey970开发板调测、 HiAI API推荐和收藏、 深度AI模型分析等新功能, 体验高清晰度和流畅度的远程AI真机调测吗? 全新的UI设计 采用最优秀的视觉及交互...

华为终端开放实验室
14分钟前
0
0
阻止事件冒泡,阻止默认事件

1.event.stopPropagation()方法 这是阻止事件的冒泡方法,不让事件向documen上蔓延,但是默认事件任然会执行,当你掉用这个方法的时候,如果点击一个连接,这个连接仍然会被打开, 2.event....

闫亚亚
16分钟前
0
0
网络监控工具类

package com.guorentong.learn.organ.utils;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.net.ConnectivityManage......

王先森oO
16分钟前
0
0
命令

sudo nginx -s reload 重启nginx sudo lsof -i -P | grep -i "listen" 查看端口占用

那个猴子
20分钟前
0
0
用scrapy-redis爬去新浪-以及把数据存储到

需求:爬取新浪网导航页(http://news.sina.com.cn/guide/)所有下所有大类、小类、小类里的子链接,以及子链接页面的新闻内容。 准备工作: a.安装redis(windows或者linux) b.安装Redis Des...

丁典
20分钟前
0
0
PHP常用函数篇

1.为什么要使用函数? 除了内建的PHP函数,我们可以创建我们自己的函数。 函数是可以在程序中重复使用的语句块。 使代码逻辑更清晰 避免过多的全局变量 封装后避免相同逻辑重复代码,只需调用...

天地有涯风有信_大海无量不见人
21分钟前
0
0
对List分组

在日常工作中会遇到这样的情景,我们需要对List按照List中对象的一个值进行分组。比如一个Human的List,我们要根据性别分组,传统的方法是做双层循环,逐个对比,今天我要介绍一种详单简单的...

珂jack
23分钟前
0
0
分析jquery ajax jsonpCallback回调函数名包含点号报错问题

现象 项目中涉及到跨域请求,采用jquery ajax jsonp来实现,但是遇到一个奇怪问题,在设置回调函数名称时,若包含点号,如“Callback.Success”,那么执行完成后,其error回调函数始终会被触...

iwaller
26分钟前
0
0
【Graphql实践】使用 Apollo(iOS) 访问 Github 的 Graphql API

最近在协助调研 Apollo 生成的代码是否有可能跨 Query 共享模型的问题,虽然初步结论是不能,并不是预期的结果,但是在调研过程中积累的一些经验,有必要记录下。如果你也对 Graphql 感兴趣,...

ios122
26分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部