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位

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

(0)

相关推荐

  • PHP实现阳历到农历转换的类实例

    本文实例讲述了PHP实现阳历到农历转换的类.分享给大家供大家参考.具体如下: 复制代码 代码如下: <?php //PHP阳历到农历转换的一个类 class Calendar { //农历每月的天数     var $everyCMonth=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=>

  • PHP编程实现阳历转换为阴历的方法实例

    本文实例讲述了PHP编程实现阳历转换为阴历的方法.分享给大家供大家参考,具体如下: php类 <?php /** * Class Lunar * 农历 节气 节日 * author:guoyu@xzd */ class Lunar { public $MIN_YEAR = 1891; public $MAX_YEAR = 2100; public $lunarInfo = array( array(0,2,9,21936),array(6,1,30,9656),array(0,2,17,9584

  • php 阴历-农历-转换类代码

    复制代码 代码如下: <?php/*** 公农历转换(1912 - 2012) * * Usage:*   // 公历1983-10-5转农历*   $lunar = new Lunar();*   $date = $lunar->getLar('1983-10-5',0);*   echo date("Y-m-d", $date);*   // 农历1983-8-29转公历*   $date = $lunar->getLar('1983-8-29',1);*   e

  • PHP实现的简单日历类

    本文实例讲述了PHP实现的简单日历类.分享给大家供大家参考. 具体实现代码如下: 复制代码 代码如下: date_default_timezone_set("etc/gmt-8"); header("Content-type: text/html; charset=utf-8"); class calendar{ var $t = array(); var $datesofmonth = array('1'=>'31','2'=>'28','3'=>

  • php下实现农历日历的代码

    复制代码 代码如下: php农历日历 <?   ###########################################   #作者: 沈潋(S&S Lab)                      #   #E-mail:shenlian@hotmail.com              #   #web: http://www.focus-2000.com           #   #                                         #

  • php+javascript的日历控件

    复制代码 代码如下: <html> <head> <title>js calendar</title> <script language="javascript"> /* Copyright Mihai Bazon, 2002-2005 | www.bazon.net/mishoo * ----------------------------------------------------------- * * The DHT

  • php实现阳历阴历互转的方法

    最近对阳历转阴历从而得到相应节日的算法这方面比较感兴趣,于是就在网上搜了一圈.不错,还算是找到一个比较不错的php类,实现了将阳历转换为阴历(农历),阴历转换为阳历的算法,同时还能获取干支纪年,生肖,以及相应的阴历的中文叫法等等,功能还是挺齐全的,在这里分享给大家. 具体类代码如下: class Lunar{ var $MIN_YEAR=1891; var $MAX_YEAR=2100; var $lunarInfo=array( array(0,2,9,21936),array(6,1,30,

  • PHP实现的汉字拼音转换和公历农历转换类及使用示例

    本文整理了PHP汉字拼音转换和公历农历转换两个功能类文件,非常实用.比如我们查找通讯录可以通过联系人姓名的拼音首字母来查询,可以通过首字母来导航大数据量,可以通过转换拼音来做网站优化等.公农历转化一般用在日历日程安排的项目中,方便农历的节日提醒等等. 1.PHP汉字转拼音 Pinyin.class.php类文件可以将大多数汉字转换成汉语拼音,当然也有个别生僻字不能转换,如果你想转换所有的汉字拼音的话,可能需要再配合一个汉字字库来实现,使用该类文件就基本能满足你的项目需求了.用法: 复制代码 代码

  • php Calender(日历)代码分享

    代码如下: 复制代码 代码如下: <?php/** *  * 我的日历 * date_default_timezone_set date mktime * @param int $year * @param int $month * @param string $timezone * @author fc_lamp */function myCalender($year = '', $month = '', $timezone = 'Asia/Shanghai'){ date_default_t

  • php实现的农历算法实例

    本文实例讲述了php实现的农历算法.分享给大家供大家参考.具体如下: <?php function lunarcalendar ($month, $year) { global $lnlunarcalendar; /** * Lunar calendar 博大精深的农历 * 原始数据和算法思路来自 S&S */ /* 农历每月的天数. 每个元素为一年.每个元素中的数据为: [0]是闰月在哪个月,0为无闰月: [1]到[13]是每年12或13个月的每月天数: [14]是当年的天干次序, [15

  • PHP完整的日历类(CLASS)

    复制代码 代码如下: <?php  class Calendar{  /*  * www.jb51.net修正版 */  var $YEAR,$MONTH,$DAY;  var $WEEK=array("星期日","星期一","星期二","星期三","星期四","星期五","星期六");  var $_MONTH=array(  "01"=&

随机推荐