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

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

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

(0)

相关推荐

  • 关于PHP转换超过2038年日期出错的问题解决

    前言 最近在写一个项目接口.测试中发现服务器上测试正常的功能,在本地一直有问题.一步步的排查,最终锁定问题是由于函数strtotime返回了一个false值,导致数据插入数据库失败. 相同代码运行结果不一样,原因那就是环境不一致导致.要么是PHP版本不同,要么是位数不同. 我电脑是64位的.这里是PHP位数不一致,服务器使用64位,而我本地是32位.而strtotime被传入了一个字符串2050-1-1 23:59:59,该参数大于了2038-1-19 03:14:07所以在32位PHP下直接返

  • PHP正则匹配日期和时间(时间戳转换)的实例代码

    先来一个比较简单实用的代码 日期YYYY-MM-DD $str = ''; $isMatched = preg_match('/^\d{4}(\-|\/|.)\d{1,2}\1\d{1,2}$/', $str, $matches); var_dump($isMatched, $matches); php需要一定的时间格式才能转换成时间戳(表示从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数),这就要用到php正则判断,以下是代码: <?php //匹配时间格式为2016-0

  • PHP判断两个给定日期是否在同一周的方法

    本文实例讲述了PHP判断两个给定日期是否在同一周的方法.分享给大家供大家参考,具体如下: /** * 判断两日期是不是同一周 * 星期是按周日到周六 */ function getSameWeek($pretime,$aftertime){ $flag = false;//默认不是同一周 $afweek = date('w',$aftertime);//当前是星期几 $mintime = $aftertime - $afweek * 3600*24;//一周开始时间 $maxtime = $af

  • PHP 实现浏览记录并按日期分组

    现有测试数据如下,要求实现如下图中的效果: array(4) { [0] => array(6) { ["visit_id"] => int(127) ["goods_id"] => int(16) ["visittime"] => int(1494399935) ["goods_name"] => string(53) "OPPO R9s 全网通4G+64G 双卡双待手机 玫瑰金&qu

  • PHP获取当前日期及本周一是几月几号的方法

    本文实例讲述了PHP获取当前日期及本周一是几月几号的方法.分享给大家供大家参考,具体如下: <?php header("content-type:text/html;charset=utf-8"); date_default_timezone_set('PRC'); function getWeek($unixTime=''){ $unixTime=is_numeric($unixTime)?$unixTime:time(); $weekarray=array('日','一','

  • php根据年月获取当月天数及日期数组的方法

    本文实例讲述了php根据年月获取当月天数及日期数组的方法.分享给大家供大家参考,具体如下: function get_day( $date ) { $tem = explode('-' , $date); //切割日期 得到年份和月份 $year = $tem['0']; $month = $tem['1']; if( in_array($month , array( 1 , 3 , 5 , 7 , 8 , 01 , 03 , 05 , 07 , 08 , 10 , 12))) { // $te

  • PHP中获取文件创建日期、修改日期、访问时间的方法

    php获取文件创建时间.修改时间常用代码 filemtime ( string filename ) 返回文件上次被修改的时间,出错时返回 FALSE.时间以 Unix 时间戳的方式返回,可用于 date(). 例如:$a=filemtime("log.txt"); echo "修改时间:".date("Y-m-d H:i:s",$a); filectime ( string filename ) 返回文件上次 inode 被修改的时间,如果出错

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

    PHP 实现公历日期与农历日期的互转换 前言: 今天根据客户的需求对时间进行了转换,就是客户要求增加农历日期的显示,在网上抄袭了一段,稍微修改了一下运行成功了,不难的,改动的很少的. 示例代码: <?php /* * * 陈海波 新二级页面 农历转换成公历 * * */ // lunar.php 新建这个php文件,所有的代码无需改,需要改的是下面teacher.php 的几行 class Lunar { private $_SMDay = array(1 => 31, 28, 31, 30,

  • Python利用zhdate模块实现农历日期处理

    目录 简介 安装 主要功能 源码 简介 zhdate模块统计从1900年到2100年的农历月份数据代码,支持农历和公历之间的转化,并且支持日期差额运算. 安装 pip install zhdate 主要功能 1.获取公历对应的农历日期 2.获取中文描述农历日期 3.计算公历距离农历差额 获取公历对应的农历日期:格式ZhDate.from_datetime(datetime(year, month, day)) print(ZhDate.from_datetime(datetime(2022, 3

  • JS简单获取当前日期和农历日期的方法

    本文实例讲述了JS简单获取当前日期和农历日期的方法.分享给大家供大家参考,具体如下: navCal.js文件如下: today=new Date(); function initArray(){ this.length=initArray.arguments.length for(var i=0;i<this.length;i++) this[i+1]=initArray.arguments[i] } var d=new initArray( "星期日", "星期一&q

  • Javascript获取当前日期的农历日期代码

    JavaScript代码 /*设置农历日期*/ var CalendarData=new Array(100); var madd=new Array(12); var numString="一二三四五六七八九十"; var monString="正二三四五六七八九十冬腊"; var cYear,cMonth,cDay,TheDate; // 农历每月只能是29或30天,一年用12(或13)个二进制位表示,从高到低,对应位为1表示30天,否则29天 Calendar

  • jQuery获取某天的农历日期并判断是否除夕或新年的方法

    本文实例讲述了jQuery获取某天的农历日期并判断是否除夕或新年的方法.分享给大家供大家参考,具体如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"

  • 批处理万年历实现代码(包括农历日期)

    核心源码 :: 月历查询工具 最初发表于CN-DOS :: 原创:foxjl 更新:namejm, qzwqzw,foxjl :: 计算农历日期部分思路及算法来自"趣味东" :: 输入的日期格式为:年-月-日(-可以替换为:./,可以混用) :: 在日历里面,★=当天 :: 支持多种格式的日期输入: :: ① 若只输入一个数,则认为是查询当年月份,自动截取后两位数字查询,★标在1日上: :: ② 若输入两个数,则认为是查询年和月,★标在1日上: :: ③ 输全的话,★标在指定日期上 :

  • Python实现公历(阳历)转农历(阴历)的方法示例

    本文实例讲述了Python实现公历(阳历)转农历(阴历)的方法.分享给大家供大家参考,具体如下: 两个要点: 1.公历转农历用了查表法(第126行) 2.节气用了天文法?(第176行) 运行图 (背景是hao123万年历) 源代码: # lunar.py # 2015/02/27 罗兵 import datetime class Lunar(object): #********************************************************************

  • javascript完美实现给定日期返回上月日期的方法

    本文实例讲述了javascript完美实现给定日期返回上月日期的方法.分享给大家供大家参考,具体如下: 在项目开发中,使用javascript对日期进行处理时,因为在查询中都会有一个初始值,大多都会在当前日期的基础上推一个月,在这种情况下,如果自己写一个,需要考虑的情况较多,在这里给大家分享一下一个比较完善的解决这个问题的方法.供大家参考.例如:给定截止日期enddate=2010-07-31 计算得到开始日期startdate=2010-06-30 这个问题的关键在于对以下几处的考虑: 1.s

  • JavaScript计算两个日期时间段内日期的方法

    本文实例讲述了JavaScript计算两个日期时间段内日期的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: /*************************  * 计算两个日期时间段内所有日期  *   * @param value1  *            开始日期 YYYY-MM-DD  * @param value2  *            结束日期  * return 日期数组  */  function dataScope(value1, value2

  • php获取本周开始日期和结束日期的方法

    本文实例讲述了php获取本周开始日期和结束日期的方法.分享给大家供大家参考.具体如下: 复制代码 代码如下: //当前日期  $sdefaultDate = date("Y-m-d");  //$first =1 表示每周星期一为开始日期 0表示每周日为开始日期  $first=1;  //获取当前周的第几天 周日是 0 周一到周六是 1 - 6  $w=date('w',strtotime($sdefaultDate));  //获取本周开始日期,如果$w是0,则表示周日,减去 6

随机推荐