现在的位置: 主页 > 公司荣誉 > 文章列表

阳历转换成阴历PHP实现详解

作者:合肥瑶海区海美电器服务部 来源:www.an128l.com 未知发布时间:2017-09-06 13:18:27
阳历转换成阴历PHP实现详解

阳历,有很强的规律性。每年12个月,1、3、5、7、8、10、12月都为31天;平年2月份28天,润年2月份29天,其余的月30天。
阴历,却没有这些规律可循。平年十二个月,大月三十天,小月二十九天,全年354天或355天(一年中哪个月大,哪个月小,年年不同)。由于每年的天数比太阳年约差十一天,所以在十九年里设置七个闰月,有闰月的年份全年383天或384天。又根据太阳的位置,把一个太阳年分成二十四个节气,以利于农业种植等活动。纪年用天干地支搭配,六十年周而复始。这种历法相传创始于夏代,所以又称为夏历。也叫旧历。 因此,推算阴历就没有一个统一的算法。
公历=阳历 是世界通用的日期也就是我们平常的日期
农历=阴历 是我国古代用来农耕的日期,也就是日历下面的小字所表示的日期
1,阳历–以地球绕太阳一周为一年所定出的历法.
2,阴历–以太阴(月亮)绕地球为一个月,12个月为一年(闰年为13个月)所定出来的历法.(以闰月调节年之四时).

思路解析 总体思路

要想计算给定的时间对于的农历是哪一天,我们需要找一个参考时间,然后以该参考时间计算以后的时间。首先计算当前时间与参考时间相差的天数,然后通过求出农历每年的天数,计算当前时间对应的是哪一年的第几天,最后计算出属于那个月的哪一个日期。

怎样计算生肖

因为共计12个生肖,”鼠”,”牛”,”虎”,”兔”,”龙”,”蛇”,”马”,”羊”,”猴”,”鸡”,”狗”,”猪”,那么每12年一个轮回。当前2016年是猴年,如果从0开始计数,猴排在第8个,且2016 % 12= 0===》(2016 % 12 +8) %12 ==8
于是可以得出公式(y代表阳历年份)
(y % 12 +8) %12
以上公式可以简化
(y % 12 -4) %12
再次简化
(y -4) %12

怎样计算天干地支

中国古代的一种纪年法。即以甲、乙、丙、丁、戊、己、庚、辛、壬、癸为十干,子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥为十二支,把干、支顺序配合。如甲子、乙丑…甲戌等,经过六十年又回到甲子。周而复始,循环不已。
且查日历可以得知1900 年是===>庚子年 丁丑月 甲辰日
假设天干地支序号都从0开始,庚排在6号位,子排在0号位
针对年而言
(1900 -4) % 10 =6 ===>庚
(1900-4) % 12 =4 ===>子
于是总结公式如下(农历年y)
(y-4) % 10 ==>天干对应的位置编号
(y-4) % 12 ==>地支对应的位置编号
同理,可以求出对应的月和,只是针对月和日,需要考虑的是闰月问题,不再细说。

具体实现

所有代码如下:

curData=$curData; }else{ $this->curData=date('Y-n-j'); } $this->init(); } public function init(){ $basedate='1900-1-31';//参照日期 $timezone='PRC'; $datetime= new DateTime($basedate, new DateTimeZone($timezone)); $curTime=new DateTime($this->curData, new DateTimeZone($timezone)); $offset = ($curTime->format('U') - $datetime->format('U'))/86400; //相差的天数 $offset=ceil($offset); $this->difDay=$offset; $offset+=1;//只能使用ceil,不能使用intval或者是floor,因为1900-1-31为正月初一,故需要加1 for($i=1900; $i<2050 && $offset>0; $i++){ $temp = $this->getYearDays($i); //计算i年有多少天 $offset -= $temp ; $this->difmonth+=12; //判断该年否存在闰月 if($this->leapMonth($i)>0){ $this->difmonth+=1; } } if($offset<0){ $offset += $temp; $i--; $this->difmonth-=12; } if($this->leapMonth($i)>0){ $this->difmonth-=1; } $this->ylDays=$offset; //此时$offset代表是农历该年的第多少天 $this->ylYeal=$i;//农历哪一年 //计算月份,依次减去1~12月份的天数,直到offset小于下个月的天数 $curMonthDays=$this->monthDays($this->ylYeal,1); //判断是否该年是否存在闰月以及闰月的天数 $this->leap=$this->leapMonth($this->ylYeal); if($this->leap !=0){ $this->leapDays=$this->leapDays($this->ylYeal); } for($i=1;$i<13 && $curMonthDays<$offset;$curMonthDays=$this->monthDays($this->ylYeal,++$i)){ if($this->leap == $i){ //闰月 if($offset>$this->leapDays){ --$i; $offset-=$this->leapDays; $this->difmonth+=1; }else{ break; } }else{ $offset-=$curMonthDays; $this->difmonth+=1; } } $this->ylMonth=$i; $this->yldate=$offset; } /** *计算农历y年有多少天 **/ public function getYearDays($y){ $sum = 348;//12*29=348,不考虑小月的情况下 for($i=0x8000; $i>=0x10; $i>>=1){ $sum += ($this->dataInfo[$y-1900] & $i)? 1: 0; } return($sum+$this->leapDays($y)); } /** *获取某一年闰月的天数 **/ public function leapDays($y){ if($this->leapMonth($y)){ return(($this->dataInfo[$y-1900] & 0x10000)? 30: 29); } else { return(0); } } /** *计算哪一月为闰月 */ public function leapMonth($y){ return ($this->dataInfo[$y-1900] & 0xf); } /** *计算农历y年m月有多少天 */ public function monthDays($y,$m){ return (($this->dataInfo[$y-1900] & (0x10000>>$m))? 30: 29 ); } public function getLyTime(){ $tmp=array('初','一','二','三','四','五','六','七','八','九','十','廿'); $dateStr=''; if($this->ylMonth>10){ $m2=intval($this->ylMonth -10); //十位 $dateStr='十'.$tmp[$m2].'月'; }elseif($this->ylMonth==1){ $dateStr='正月'; }else{ $dateStr=$tmp[$this->ylMonth].'月'; } if($this->yldate <11){ $dateStr.='初'.$tmp[$this->yldate]; }else{ $m1=intval($this->yldate / 10); if( $m1 !=3){ $dateStr.=($m1==1)?'十':'廿'; $m2=$this->yldate % 10; if($m2==0){ $dateStr.='十'; }else{ $dateStr.=$tmp[$m2]; } }else{ $dateStr.='三十'; } } return $dateStr; } /** *获取该年对于的天干地支年 **/ public function getYGanZhi(){ $gan=$this->tianGan[($this->ylYeal-4) % 10]; $zhi=$this->diZhi[($this->ylYeal-4) % 12]; return $gan.$zhi.'年'; } /** *获取该年对于的天干地支月 **/ public function getMGanZhi(){ $gan=$this->tianGan[($this->difmonth+3) % 10]; $zhi=$this->diZhi[($this->difmonth+1) % 12]; return $gan.$zhi.'月'; } /** *获取该年对于的天干地支日 **/ public function getDGanZhi(){ $gan=$this->tianGan[$this->difDay % 10]; $zhi=$this->diZhi[($this->difDay+4) % 12]; return $gan.$zhi.'日'; } } $c=new Calendar(); $time=$c->getLyTime(); trace(date('Y-n-j').'对应的农历时间:'.$time); $c=new Calendar('2014-10-1'); $time=$c->getLyTime(); trace(date('Y-n-j').'对应的农历时间:'.$time); function trace($info=''){ echo ' '; print_r($info); echo ' '; }

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉网页设计 https://www.feimao666.com

上一篇:python访问redis 下一篇:最后一页