php阳历转农历优化版

5年以前  |  阅读数:793 次  |  编程语言:PHP 

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


    <?php

    function nongli($riqi)
    {
    //优化修改 20160807 FXL 
    $nian=date('Y',strtotime($riqi));
    $yue=date('m',strtotime($riqi));
    $ri=date('d',strtotime($riqi));

     #源码部分原作者:沈潋(S&S; Lab) 
     #农历每月的天数 
     $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) 
              ); 
    ############################## 
     #农历天干 
     $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>2020) 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; 
         case 2: 
           $total+=31; 
     } 
     if($nian%4 == 0 && $yue>2) $total++; //如果当年是闰年还要加一天 
     $total=$total+$ri-1; //加当月的天数 
     $flag1=0; //判断跳出循环的条件 
     $j=0; 
     while ($j<=120){ //用农历的天数累加来判断是否超过阳历的天数 
       $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];#闰月 
     } 
     else { 
       $nlmon=$mmonth[$mm].$mmonth[13]; 
     } 
     #计算所求月份1号的农历日期 
     $md=$everymonth[$j][$i]-($mtotal-$total); 
     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; 
     return $nowday;
    }
    echo nongli('20160807'); //标准8位

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例