php计算农历日期

因为项目是面向海外的,所以调用网上判断节假日的接口是没用的,最后决定只判断春节与国庆节。

我的想法是通过判断农历日期来单独判断春节,如果有更好的办法欢迎大神指点哈。

下面贴代码(这个类是很早之前在网上看到一个前辈写的,原帖找不到了)

class Calendar{private $animals=array("鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪");private $curData=null;//当前阳历时间private $ylYeal=0;private $ylMonth=0;private $yldate=0;private $ylDays=0; //当前日期是农历年的第多少天private $leap=0;//代表润哪一个月private $leapDays=0;//代表闰月的天数private $difmonth=0;//当前时间距离参考时间相差多少月private $difDay=0;//当前时间距离参考时间相差多少天private $tianGan=array("甲","乙","丙","丁","戊","己","庚","辛","壬","癸");private $diZhi=array("子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥");private $dataInfo=array(0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,//1900-19090x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,//1910-19190x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,//1920-19290x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,//1930-19390x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,//1940-19490x06ca0,0x0b550,0x15355,0x04da0,0x0a5b0,0x14573,0x052b0,0x0a9a8,0x0e950,0x06aa0,//1950-19590x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,//1960-19690x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b6a0,0x195a6,//1970-19790x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,//1980-19890x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,//1990-19990x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,//2000-20090x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,//2010-20190x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,//2020-20290x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,//2030-20390x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0,//2040-20490x14b63,0x09370,0x049f8,0x04970,0x064b0,0x168a6,0x0ea50, 0x06b20,0x1a6c4,0x0aae0,//2050-20590x0a2e0,0x0d2e3,0x0c960,0x0d557,0x0d4a0,0x0da50,0x05d55,0x056a0,0x0a6d0,0x055d4,//2060-20690x052d0,0x0a9b8,0x0a950,0x0b4a0,0x0b6a6,0x0ad50,0x055a0,0x0aba4,0x0a5b0,0x052b0,//2070-20790x0b273,0x06930,0x07337,0x06aa0,0x0ad50,0x14b55,0x04b60,0x0a570,0x054e4,0x0d160,//2080-20890x0e968,0x0d520,0x0daa0,0x16aa6,0x056d0,0x04ae0,0x0a9d4,0x0a2d0,0x0d150,0x0f252,//2090-20990x0d520);public function  __construct($curData=null){if(!empty($curData)){$this->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为正月初一,故需要加1for($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();//这个是我很low判断,哈哈
if($time == '正月初一' || $time == '正月初二' || $time == '正月初三' || $time == '正月初四' || $time == '正月初五' || $time == '正月初六' || $time == '正月初七' ||
('1001'<= $date && $date <= '1007') ){return '1';//放假
}else{return '0';//不放假
}

php 计算农历日期相关推荐

  1. 打表法计算农历错误数据处理之除夕修正

    这几天犯懒,没有心思研究原代码,农历除夕总显示"1月0日"这事又让人讨厌,所以今天采取了个权宜之计,"让"它显示正确除夕.其实也很简单,就是不改变原计算结果,只 ...

  2. 根据当期日期计算,农历日期的类

    根据当期日期计算,农历日期的类 public class Lunar {private int year; private int month; private int day; private bo ...

  3. js 根据公历日期 算出农历_根据公历日期计算农历年生肖及公历转换农历的方法...

    本帖最后由 wshcw 于 2011-12-6 23:23 编辑 有部分E友都知道,农历格式"[$-130000]e-m-d"转换出来的结果有好大一部分有误,那有没有其它转换办法呢 ...

  4. python算闰年和平年的天数_Python自定义函数计算给定日期是该年第几天的方法示例...

    本文实例讲述了Python自定义函数计算给定日期是该年第几天的方法.分享给大家供大家参考,具体如下: 写一个函数,计算给定日期是该年的第几天. 满足闰年的条件: 闰年是公历中的名词,能被4整除但不能被 ...

  5. python函数求n年后本息_Python自定义函数计算给定日期是该年第几天的方法示例...

    本文实例讲述了Python自定义函数计算给定日期是该年第几天的方法.分享给大家供大家参考,具体如下: 写一个函数,计算给定日期是该年的第几天. 满足闰年的条件: 闰年是公历中的名词,能被4整除但不能被 ...

  6. php获取农历日期节日

    $c = new DayService();$today=$c->convertSolarToLunar(date('Y'),date('m'),date('d'));$time =" ...

  7. 比较精确的计算农历节气的java源码

    在网上找了好多计算农历节气的java源码,有好多都有误差,另外靠存储查找的方法终究不靠谱. 最近在"绿色冰点"的博客上看到了关于"寿星万年历---java算法实现&quo ...

  8. 个人永久性免费-Excel催化剂功能第34波-提取中国身份证信息、农历日期转换相关功能...

    这两天又被刷朋友圈,又来了一个自主研发红芯浏览器,国产啊国产,这是谁的梦.就算国产了,自主了,无底线的夸大吹嘘无道德,企业如是,国家如是,大清已亡!再牛B的技术落在天天删敏感信息.无法治.无安全感可言 ...

  9. mysql 获取农历年份_iOS 获取公历、农历日期的年月日

    iOS 获取公历.农历日期的年月日 介绍三种方法获取 Date (NSDate) 的年月日. 用 date 表示当前日期.测试日期为公历 2017 年 2 月 5 日,农历丁酉年,鸡年,正月初九. l ...

最新文章

  1. 基于heartbeat v1+ldirectord实现LVS的高可用
  2. c++编程例子_如何开始厉害的C语言编程?大神都是这样开始的!
  3. SQL Server中的Image数据类型的操作
  4. WPF内存泄露:CollectionViewSource.GetDefaultView导致Cache对象
  5. 收藏的RabbitMQ资料,分享给大家
  6. Maven修改默认仓库为阿里云仓库
  7. 如何启动MongoDB数据库 - 基础篇
  8. T-SQL备忘(2):聚合函数运算和NULL
  9. Grunt-Kmc基于KISSY项目打包
  10. 黄国兴计算机应用基础,黄国兴计算机应用基础 - 百度学术
  11. Linux一些软件的安装
  12. 分页地址的地址结构怎么理解?
  13. java类可视化doxygen_安装doxygen(一个自动文档生成工具)+Graphviz图形可视化软件...
  14. 使用公用计算机的用户如何,如何通过设置权限来管理公用电脑?
  15. 为什么不使用Go语言呢?
  16. 计算机科学与导论教案,计算机科学导论电子教案.ppt
  17. [转载]在安装win7系统时如何不产生100M的系统保留分区
  18. wifi678响应超时服务器无应答,Win8宽带连接出现错误678的处理方法
  19. 机器学习 Cohen s Kappa,Quadratic Weighted Kappa 详解
  20. vant swipe 三图一屏

热门文章

  1. 安装 MySql5.7 详细教程,操作简单(Windows版本)
  2. wlan服务器文件路径,用于无线局域网 (WLAN) 的 Netsh 命令
  3. 计算机组成原理期末试题
  4. Windows 子系统 (WSL)的使用
  5. 小啊呜产品读书笔记001:《邱岳的产品手记-16》第30讲产品案例分析:Primer的扑克牌交互 第31讲 产品分析的套路(下):如何出解决方案?
  6. 更有劲儿的筋膜枪,运动按摩超痛快,OPOVE APEX筋膜枪上手
  7. 计算机辅助工业设计教案,工业设计手绘教学范文
  8. 如何关闭联想杀毒Plus
  9. 接口报错问题以及解决方法
  10. 各种网易黄金激活码,新手码,实时更新可用,点击图片领取,真正的福利,快人一步