PHP 实现公历日期与农历日期的互转换


Posted in PHP onSeptember 13, 2017

PHP 实现公历日期与农历日期的互转换

前言:

 今天根据客户的需求对时间进行了转换,就是客户要求增加农历日期的显示,在网上抄袭了一段,稍微修改了一下运行成功了,不难的,改动的很少的.

示例代码:

<?php 
/*
 * 
 * 陈海波   新二级页面 农历转换成公历
 * 
 * */
// lunar.php   新建这个php文件,所有的代码无需改,需要改的是下面teacher.php 的几行
class Lunar
{ 
 private $_SMDay = array(1 => 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);//定义公历月分天数 
 private $_LStart = 1950 ;//农历从1950年开始 
 private $_LMDay = array( 
  //差:该年的农历正月初一到该年公历1月1日的天数;1~12:农历月份天数;闰:如有闰月,记录该月平月天数 
  //  差 1 2 3 4 5 6 7 8 9 10 11 12 闰 
  array(47,29,30,30,29,30,30,29,29,30,29,30,29), 
  array(36,30,29,30,30,29,30,29,30,29,30,29,30), 
  array(6,29,30,29,30,59,29,30,30,29,30,29,30,29),  //五月29 闰五月30 
  array(44,29,30,29,29,30,30,29,30,30,29,30,29), 
  array(33,30,29,30,29,29,30,29,30,30,29,30,30), 
  array(23,29,30,59,29,29,30,29,30,29,30,30,30,29),  //三月29 闰三月30 
  array(42,29,30,29,30,29,29,30,29,30,29,30,30), 
  array(30,30,29,30,29,30,29,29,59,30,29,30,29,30),  //八月30 闰八月29 
  array(48,30,30,30,29,30,29,29,30,29,30,29,30), 
  array(38,29,30,30,29,30,29,30,29,30,29,30,29), 
  array(27,30,29,30,29,30,59,30,29,30,29,30,29,30),  //六月30 闰六月29 
  array(45,30,29,30,29,30,29,30,30,29,30,29,30), 
  array(35,29,30,29,29,30,29,30,30,29,30,30,29), 
  array(24,30,29,30,58,30,29,30,29,30,30,30,29,29),  //四月29 闰四月29 
  array(43,30,29,30,29,29,30,29,30,29,30,30,30), 
  array(32,29,30,29,30,29,29,30,29,29,30,30,29), 
  array(20,30,30,59,30,29,29,30,29,29,30,30,29,30),  //三月30 闰三月29 
  array(39,30,30,29,30,30,29,29,30,29,30,29,30), 
  array(29,29,30,29,30,30,29,59,30,29,30,29,30,30),  //七月30 闰七月29 
  array(47,29,30,29,30,29,30,30,29,30,29,30,29), 
  array(36,30,29,29,30,29,30,30,29,30,30,29,30), 
  array(26,29,30,29,29,59,30,29,30,30,30,29,30,30),  //五月30 闰五月29 
  array(45,29,30,29,29,30,29,30,29,30,30,29,30), 
  array(33,30,29,30,29,29,30,29,29,30,30,29,30), 
  array(22,30,30,29,59,29,30,29,29,30,30,29,30,30),  //四月30 闰四月29 
 array(41,30,30,29,30,29,29,30,29,29,30,29,30), 
 array(30,30,30,29,30,29,30,29,59,29,30,29,30,30),  //八月30 闰八月29 
 array(48,30,29,30,30,29,30,29,30,29,30,29,29), 
 array(37,30,29,30,30,29,30,30,29,30,29,30,29), 
 array(27,30,29,29,30,29,60,29,30,30,29,30,29,30),  //六月30 闰六月30 
 array(46,30,29,29,30,29,30,29,30,30,29,30,30), 
 array(35,29,30,29,29,30,29,29,30,30,29,30,30), 
 array(24,30,29,30,58,30,29,29,30,29,30,30,30,29),  //四月29 闰四月29 
 array(43,30,29,30,29,29,30,29,29,30,29,30,30), 
 array(32,30,29,30,30,29,29,30,29,29,59,30,30,30),  //十月30 闰十月29 
 array(50,29,30,30,29,30,29,30,29,29,30,29,30), 
 array(39,29,30,30,29,30,30,29,30,29,30,29,29), 
 array(28,30,29,30,29,30,59,30,30,29,30,29,29,30),  //六月30 闰六月29 
 array(47,30,29,30,29,30,29,30,30,29,30,30,29), 
 array(36,30,29,29,30,29,30,29,30,29,30,30,30), 
 array(26,29,30,29,29,59,29,30,29,30,30,30,30,30),  //五月30 闰五月29 
 array(45,29,30,29,29,30,29,29,30,29,30,30,30), 
 array(34,29,30,30,29,29,30,29,29,30,29,30,30), 
 array(22,29,30,59,30,29,30,29,29,30,29,30,29,30),  //三月30 闰三月29 
 array(40,30,30,30,29,30,29,30,29,29,30,29,30), 
 array(30,29,30,30,29,30,29,30,59,29,30,29,30,30),  //八月30 闰八月29 
 array(49,29,30,29,30,30,29,30,29,30,30,29,29), 
 array(37,30,29,30,29,30,29,30,30,29,30,30,29), 
 array(27,30,29,29,30,58,30,30,29,30,30,29,30,29),  //五月29 闰五月29 
 array(46,30,29,29,30,29,29,30,29,30,30,30,29), 
 array(35,30,30,29,29,30,29,29,30,29,30,30,29), 
 array(23,30,30,29,59,30,29,29,30,29,30,29,30,30),  //四月30 闰四月29 
 array(42,30,30,29,30,29,30,29,29,30,29,30,29), 
 array(31,30,30,29,30,30,29,30,29,29,30,29,30), 
 array(21,29,59,30,30,29,30,29,30,29,30,29,30,30),  //二月30 闰二月29 
 array(39,29,30,29,30,29,30,30,29,30,29,30,29), 
 array(28,30,29,30,29,30,29,59,30,30,29,30,30,30),  //七月30 闰七月29 
 array(48,29,29,30,29,29,30,29,30,30,30,29,30), 
 array(37,30,29,29,30,29,29,30,29,30,30,29,30), 
 array(25,30,30,29,29,59,29,30,29,30,29,30,30,30),  //五月30 闰五月29 
 array(44,30,29,30,29,30,29,29,30,29,30,29,30), 
 array(33,30,29,30,30,29,30,29,29,30,29,30,29), 
 array(22,30,29,30,59,30,29,30,29,30,29,30,29,30),  //四月30 闰四月29 
 array(40,30,29,30,29,30,30,29,30,29,30,29,30), 
 array(30,29,30,29,30,29,30,29,30,59,30,29,30,30),  //九月30 闰九月29 
 array(49,29,30,29,29,30,29,30,30,30,29,30,29), 
 array(38,30,29,30,29,29,30,29,30,30,29,30,30), 
 array(27,29,30,29,30,29,59,29,30,29,30,30,30,29),  //六月29 闰六月30 
 array(46,29,30,29,30,29,29,30,29,30,29,30,30), 
 array(35,30,29,30,29,30,29,29,30,29,29,30,30), 
 array(24,29,30,30,59,30,29,29,30,29,30,29,30,30),  //四月30 闰四月29 
 array(42,29,30,30,29,30,29,30,29,30,29,30,29), 
 array(31,30,29,30,29,30,30,29,30,29,30,29,30), 
 array(21,29,59,29,30,30,29,30,30,29,30,29,30,30),  //二月30 闰二月29 
 array(40,29,30,29,29,30,29,30,30,29,30,30,29), 
 array(28,30,29,30,29,29,59,30,29,30,30,30,29,30),  //六月30 闰六月29 
 array(47,30,29,30,29,29,30,29,29,30,30,30,29), 
 array(36,30,30,29,30,29,29,30,29,29,30,30,29), 
 array(25,30,30,30,29,59,29,30,29,29,30,30,29,30),  //五月30 闰五月29 
 array(43,30,30,29,30,29,30,29,30,29,29,30,30), 
 array(33,29,30,29,30,30,29,30,29,30,29,30,29), 
 array(22,29,30,59,30,29,30,30,29,30,29,30,29,30),  //三月30 闰三月29 
 array(41,30,29,29,30,29,30,30,29,30,30,29,30), 
 array(30,29,30,29,29,30,29,30,29,30,30,59,30,30),  //十一月30 闰十一月29 
 array(49,29,30,29,29,30,29,30,29,30,30,29,30), 
 array(38,30,29,30,29,29,30,29,29,30,30,29,30), 
 array(27,30,30,29,30,29,59,29,29,30,29,30,30,29),  //六月29 闰六月30 
 array(45,30,30,29,30,29,29,30,29,29,30,29,30), 
 array(34,30,30,29,30,29,30,29,30,29,29,30,29), 
 array(23,30,30,29,30,59,30,29,30,29,30,29,29,30),  //五月30 闰五月29 
 array(42,30,29,30,30,29,30,29,30,30,29,30,29), 
 array(31,29,30,29,30,29,30,30,29,30,30,29,30), 
 array(21,29,59,29,30,29,30,29,30,30,29,30,30,30),  //二月30 闰二月29 
 array(40,29,30,29,29,30,29,29,30,30,29,30,30), 
 array(29,30,29,30,29,29,30,58,30,29,30,30,30,29),  //七月29 闰七月29 
 array(47,30,29,30,29,29,30,29,29,30,29,30,30), 
 array(36,30,29,30,29,30,29,30,29,29,30,29,30), 
 array(25,30,29,30,30,59,29,30,29,29,30,29,30,29),  //五月29 闰五月30 
 array(44,29,30,30,29,30,30,29,30,29,29,30,29), 
 array(32,30,29,30,29,30,30,29,30,30,29,30,29), 
 array(22,29,30,59,29,30,29,30,30,29,30,30,29,29),  //三月29 闰三月30     
 ); 
  //是否闰年 
  private function IsLeapYear($AYear)
  { 
   return ($AYear % 4 == 0) && (($AYear % 100 != 0) || ($AYear % 400 == 0)); 
  } 
  //公历该月的天数(year:年份; month:月份) 
  private function GetSMon($year,$month) 
  { 
    if($this->IsLeapYear($year) && $month == 2) 
       return 29; 
    else 
      return $this->_SMDay[$month]; 
  } 
   //农历名称转换 
  private function LYearName($year) 
  { 
    $Name = array("零","一","二","三","四","五","六","七","八","九"); 
    for($i=0;$i<4;$i++) 
      for($k=0;$k<10;$k++) 
        if($year[$i]==$k) 
          $tmp.=$Name[$k]; 
     return $tmp; 
  } 
  private function LMonName($month) 
  { 
     if($month >=1 && $month <=12 ) 
     { 
      $Name = array( 1=>"正","二","三","四","五","六","七","八","九","十","十一","十二"); 
      return $Name[$month]; 
    } 
    return $month; 
  } 
  private function LDayName($day) 
  { 
     if($day >=1 && $day <=30 ) 
     { 
       $Name = array( 1 => 
      "初一","初二","初三","初四","初五","初六","初七","初八","初九","初十", 
       "十一","十二","十三","十四","十五","十六","十七","十八","十九","二十", 
       "廿一","廿二","廿三","廿四","廿五","廿六","廿七","廿八","廿九","三十" 
       ); 
       return $Name[$day]; 
     }  
    return $day; 
  } 
   //公历转农历(Sdate:公历日期) 
  public function S2L($date) 
  { 
    list($year, $month, $day) = explode("-", $date); 
    if($year <= 1951 || $month <= 0 || $day <= 0 || $year >= 2051 ) return false; 
     //获取查询日期到当年1月1日的天数 
    $date1 = strtotime($year."-01-01");//当年1月1日 
    $date2 = strtotime($year."-".$month."-".$day); 
    $days=round(($date2-$date1)/3600/24); 
    $days += 1; 
     //获取相应年度农历数据,化成数组Larray 
    $Larray = $this->_LMDay[$year - $this->_LStart]; 
     if($days <= $Larray[0]) 
     { 
       $Lyear = $year - 1; 
      $days = $Larray[0] - $days; 
      $Larray = $this->_LMDay[$Lyear - $this->_LStart]; 
       if($days < $Larray[12]) 
      { 
         $Lmonth = 12; 
         $Lday = $Larray[12] - $days; 
       } 
       else
      { 
        $Lmonth = 11; 
        $days = $days - $Larray[12]; 
         $Lday = $Larray[11] - $days; 
      }      
     } 
     else
     { 
       $Lyear = $year; 
       $days = $days - $Larray[0]; 
       for($i = 1;$i <= 12;$i++) 
       { 
         if($days > $Larray[$i]) $days = $days - $Larray[$i]; 
        else 
         { 
          if ($days > 30){ 
             $days = $days - $Larray[13]; 
             $Ltype = 1; 
          } 
          $Lmonth = $i; 
          $Lday = $days; 
           break; 
         } 
      } 
     } 
     return mktime(0, 0, 0, $Lmonth, $Lday, $Lyear); 
     //$Ldate = $Lyear."-".$Lmonth."-".$Lday; 
     //$Ldate = $this->LYearName($Lyear)."年".$this->LMonName($Lmonth)."月".$this->LDayName($Lday); 
     //if($Ltype) $Ldate.="(闰)"; 
     //return $Ldate; 
   } 
   //农历转公历(date:农历日期; type:是否闰月) 
   public function L2S($date,$type = 0) 
 { 
     list($year, $month, $day) = split("-",$date); 
     if($year <= 1951 || $month <= 0 || $day <= 0 || $year >= 2051 ) return false; 
     $Larray = $this->_LMDay[$year - $this->_LStart]; 
     if($type == 1 && count($Larray)<=12 ) return false;//要求查询闰,但查无闰月 
     //如果查询的农历是闰月并该年度农历数组存在闰月数据就获取 
     if($Larray[$month]>30 && $type == 1 && count($Larray) >=13)  $day = $Larray[13] + $day; 
     //获取该年农历日期到公历1月1日的天数 
     $days = $day; 
     for($i=0;$i<=$month-1;$i++) 
       $days += $Larray[$i]; 
    //当查询农历日期距离公历1月1日超过一年时 
    if($days > 366 || ($this->GetSMon($month,2)!=29 && $days>365 )) 
     { 
       $Syear = $year +1; 
      if($this->GetSMon($month,2)!=29) 
        $days-=366; 
       else
        $days-=365; 
       if($days > $this->_SMDay[1]) 
       { 
        $Smonth = 2; 
         $Sday = $days - $this->_SMDay[1]; 
      } 
       else
      { 
         $Smonth = 1; 
         $Sday = $days; 
       }    
     } 
     else
     { 
       $Syear =$year; 
      for($i=1;$i<=12;$i++) 
       { 
        if($days > $this->GetSMon($Syear,$i)) 
          $days-=$this->GetSMon($Syear,$i); 
         else
         { 
          $Smonth = $i; 
          $Sday = $days; 
          break; 
         } 
       } 
     } 
     return mktime(0, 0, 0, $Smonth, $Sday, $Syear); 
     //$Sdate = $Syear."-".$Smonth."-".$Sday; 
     //return $Sdate; 
   } 
 } 
?>

  teacher.php

//公历转农历 
 require_once(CORE_."Lunar.php");  // 加载lunar.php文件
 $today = date("Y-m-d"); 
 $lunar = new Lunar();       // 实例化类
 $nonglitime = array();
 $nl = date("Y-n-d",$lunar->S2L($today));  
 echo $nl;exit;  // 转为农历是:2012-05-25

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

PHP 相关文章推荐
php后台程序与Javascript的两种交互方式
Oct 25 PHP
PHP中strtotime函数使用方法详解
Nov 27 PHP
用PHP实现弹出消息提示框的两种方法
Dec 17 PHP
全面解读PHP的人气开发框架Laravel
Oct 15 PHP
php session 写入数据库
Feb 13 PHP
Yii2中关联查询简单用法示例
Aug 10 PHP
php微信开发之自定义菜单完整流程
Oct 08 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
Nov 15 PHP
Yii CDBCriteria常用方法实例小结
Jan 19 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
May 05 PHP
PHP实现APP微信支付的实例讲解
Feb 10 PHP
php 多继承的几种常见实现方法示例
Nov 18 PHP
php生成条形码的图片的实例详解
Sep 13 #PHP
php之可变函数的实例详解
Sep 13 #PHP
PHP实现一个多功能购物网站的案例
Sep 13 #PHP
php之可变变量的实例详解
Sep 12 #PHP
PHP清除缓存的几种方法总结
Sep 12 #PHP
PHP 传输会话curl函数的实例详解
Sep 12 #PHP
基于ThinkPHP5.0实现图片上传插件
Sep 25 #PHP
You might like
PHP 登录完成后如何跳转上一访问页面
2014/01/14 PHP
Thinkphp模板标签if和eq的区别和比较实例分析
2015/07/01 PHP
ThinkPHP中调用PHPExcel的实现代码
2017/04/08 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
2019/05/13 PHP
ExtJS 设置级联菜单的默认值
2010/06/13 Javascript
JavaScript与Image加载事件(onload)、加载状态(complete)
2011/02/14 Javascript
Jquery中国地图热点效果-鼠标经过弹出提示层信息的简单实例
2014/02/12 Javascript
JavaScript中按位“异或”运算符使用介绍
2014/03/14 Javascript
node.js中的fs.stat方法使用说明
2014/12/16 Javascript
js实现从中间开始往上下展开网页窗口的方法
2015/03/02 Javascript
jquery实现适用于门户站的导航下拉菜单效果代码
2015/08/24 Javascript
关于JavaScript和jQuery的类型判断详解
2016/10/08 Javascript
jquery实现超简单的瀑布流布局【推荐】
2017/03/08 Javascript
Linux CentOS系统下安装node.js与express的方法
2017/04/01 Javascript
简单实现js轮播图效果
2017/07/14 Javascript
js获取css的各种样式并且设置他们的方法
2017/08/22 Javascript
js排序与重组的实例讲解
2017/08/28 Javascript
vue+vue-validator 表单验证功能的实现代码
2017/11/13 Javascript
element-ui循环显示radio控件信息的方法
2018/08/24 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
最全vue的vue-amap使用高德地图插件画多边形范围的示例代码
2020/07/17 Javascript
Python获取单个程序CPU使用情况趋势图
2015/03/10 Python
分析用Python脚本关闭文件操作的机制
2015/06/28 Python
python简单实现获取当前时间
2016/08/27 Python
python如何读取bin文件并下发串口
2019/07/05 Python
python数据归一化及三种方法详解
2019/08/06 Python
Django异步任务线程池实现原理
2019/12/17 Python
美赞臣新加坡官方旗舰店:Enfagrow新加坡
2019/05/15 全球购物
外语专业毕业生个人的自荐信
2013/11/19 职场文书
党员领导干部承诺书
2014/05/28 职场文书
就业协议书
2014/09/12 职场文书
党员民主生活会对照检查材料思想汇报
2014/09/28 职场文书
教师政风行风自查自纠报告
2014/10/21 职场文书
2015年煤矿安全工作总结
2015/05/23 职场文书
竞聘演讲报告:基本写作有哪些?附开头范文
2019/10/16 职场文书
oracle删除超过N天数据脚本的方法
2022/02/28 Oracle