搜索
首页php教程php手册PHP日期操作类代码-农历-阳历转换、闰年、计算天数等

PHP日期操作类代码-农历-阳历转换、闰年、计算天数等

Jun 13, 2016 am 09:37 AM
php代码农历天数操作日期时间实际的计算转换闰年

   这是一个实用的PHP日期时间操作类,里面包括了公历-农历转换、转换成中文日期格式、计算农历相隔天数、根据阴历年获取生肖、获取阴历月份的天数、获取农历每年的天数、获取闰月、计算阴历日期与正月初一相隔的天数、计算2个公历(阳历)日期之间的天数、根据距离正月初一的天数计算阴历日期、获取天干地支纪年等,PHP日期操作类:Lunar.class.php代码如下:

  001

  002class Lunar {

  003 var $MIN_YEAR = 1891;

  004 var $MAX_YEAR = 2100;

  005 var $lunarInfo = array(

  006 array(0,2,9,21936),array(6,1,30,9656),array(0,2,17,9584),array(0,2,6,21168),array(5,1,26,43344),array(0,2,13,59728),

  007 array(0,2,2,27296),array(3,1,22,44368),array(0,2,10,43856),array(8,1,30,19304),array(0,2,19,19168),array(0,2,8,42352),

  008 array(5,1,29,21096),array(0,2,16,53856),array(0,2,4,55632),array(4,1,25,27304),array(0,2,13,22176),array(0,2,2,39632),

  009 array(2,1,22,19176),array(0,2,10,19168),array(6,1,30,42200),array(0,2,18,42192),array(0,2,6,53840),array(5,1,26,54568),

  010 array(0,2,14,46400),array(0,2,3,54944),array(2,1,23,38608),array(0,2,11,38320),array(7,2,1,18872),array(0,2,20,18800),

  011 array(0,2,8,42160),array(5,1,28,45656),array(0,2,16,27216),array(0,2,5,27968),array(4,1,24,44456),array(0,2,13,11104),

  012 array(0,2,2,38256),array(2,1,23,18808),array(0,2,10,18800),array(6,1,30,25776),array(0,2,17,54432),array(0,2,6,59984),

  013 array(5,1,26,27976),array(0,2,14,23248),array(0,2,4,11104),array(3,1,24,37744),array(0,2,11,37600),array(7,1,31,51560),

  014 array(0,2,19,51536),array(0,2,8,54432),array(6,1,27,55888),array(0,2,15,46416),array(0,2,5,22176),array(4,1,25,43736),

  015 array(0,2,13,9680),array(0,2,2,37584),array(2,1,22,51544),array(0,2,10,43344),array(7,1,29,46248),array(0,2,17,27808),

  016 array(0,2,6,46416),array(5,1,27,21928),array(0,2,14,19872),array(0,2,3,42416),array(3,1,24,21176),array(0,2,12,21168),

  017 array(8,1,31,43344),array(0,2,18,59728),array(0,2,8,27296),array(6,1,28,44368),array(0,2,15,43856),array(0,2,5,19296),

  018 array(4,1,25,42352),array(0,2,13,42352),array(0,2,2,21088),array(3,1,21,59696),array(0,2,9,55632),array(7,1,30,23208),

  019 array(0,2,17,22176),array(0,2,6,38608),array(5,1,27,19176),array(0,2,15,19152),array(0,2,3,42192),array(4,1,23,53864),

  020 array(0,2,11,53840),array(8,1,31,54568),array(0,2,18,46400),array(0,2,7,46752),array(6,1,28,38608),array(0,2,16,38320),

  021 array(0,2,5,18864),array(4,1,25,42168),array(0,2,13,42160),array(10,2,2,45656),array(0,2,20,27216),array(0,2,9,27968),

  022 array(6,1,29,44448),array(0,2,17,43872),array(0,2,6,38256),array(5,1,27,18808),array(0,2,15,18800),array(0,2,4,25776),

  023 array(3,1,23,27216),array(0,2,10,59984),array(8,1,31,27432),array(0,2,19,23232),array(0,2,7,43872),array(5,1,28,37736),

  024 array(0,2,16,37600),array(0,2,5,51552),array(4,1,24,54440),array(0,2,12,54432),array(0,2,1,55888),array(2,1,22,23208),

  025 array(0,2,9,22176),array(7,1,29,43736),array(0,2,18,9680),array(0,2,7,37584),array(5,1,26,51544),array(0,2,14,43344),

  026 array(0,2,3,46240),array(4,1,23,46416),array(0,2,10,44368),array(9,1,31,21928),array(0,2,19,19360),array(0,2,8,42416),

  027 array(6,1,28,21176),array(0,2,16,21168),array(0,2,5,43312),array(4,1,25,29864),array(0,2,12,27296),array(0,2,1,44368),

  028 array(2,1,22,19880),array(0,2,10,19296),array(6,1,29,42352),array(0,2,17,42208),array(0,2,6,53856),array(5,1,26,59696),

  029 array(0,2,13,54576),array(0,2,3,23200),array(3,1,23,27472),array(0,2,11,38608),array(11,1,31,19176),array(0,2,19,19152),

  030 array(0,2,8,42192),array(6,1,28,53848),array(0,2,15,53840),array(0,2,4,54560),array(5,1,24,55968),array(0,2,12,46496),

  031 array(0,2,1,22224),array(2,1,22,19160),array(0,2,10,18864),array(7,1,30,42168),array(0,2,17,42160),array(0,2,6,43600),

  032 array(5,1,26,46376),array(0,2,14,27936),array(0,2,2,44448),array(3,1,23,21936),array(0,2,11,37744),array(8,2,1,18808),

  033 array(0,2,19,18800),array(0,2,8,25776),array(6,1,28,27216),array(0,2,15,59984),array(0,2,4,27424),array(4,1,24,43872),

  034 array(0,2,12,43744),array(0,2,2,37600),array(3,1,21,51568),array(0,2,9,51552),array(7,1,29,54440),array(0,2,17,54432),

  035 array(0,2,5,55888),array(5,1,26,23208),array(0,2,14,22176),array(0,2,3,42704),array(4,1,23,21224),array(0,2,11,21200),

  036 array(8,1,31,43352),array(0,2,19,43344),array(0,2,7,46240),array(6,1,27,46416),array(0,2,15,44368),array(0,2,5,21920),

  037 array(4,1,24,42448),array(0,2,12,42416),array(0,2,2,21168),array(3,1,22,43320),array(0,2,9,26928),array(7,1,29,29336),

  038 array(0,2,17,27296),array(0,2,6,44368),array(5,1,26,19880),array(0,2,14,19296),array(0,2,3,42352),array(4,1,24,21104),

  039 array(0,2,10,53856),array(8,1,30,59696),array(0,2,18,54560),array(0,2,7,55968),array(6,1,27,27472),array(0,2,15,22224),

  040 array(0,2,5,19168),array(4,1,25,42216),array(0,2,12,42192),array(0,2,1,53584),array(2,1,21,55592),array(0,2,9,54560)

  041 );

  042 /**

  043 * 将阳历转换为阴历

  044 * @param year 公历-年

  045 * @param month 公历-月

  046 * @param date 公历-日

  047 */

  048 function convertSolarToLunar($year,$month,$date){

  049 //debugger;

  050 $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];

  051 if($year==$this->MIN_YEAR&&$month

  052 return array(1891,'正月','初一','辛卯',1,1,'兔');

  053 }

  054 return $this->getLunarByBetween($year,$this->getDaysBetweenSolar($year,$month,$date,$yearData[1],$yearData[2]));

  055 }

  056 function convertSolarMonthToLunar($year,$month) {

  057 $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];

  058 if($year==$this->MIN_YEAR&&$month

  059 return array(1891,'正月','初一','辛卯',1,1,'兔');

  060 }

  061 $month_days_ary = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

  062 $dd = $month_days_ary[$month];

  063 if($this->isLeapYear($year) && $month == 2) $dd++;

  064 $lunar_ary = array();

  065 for ($i = 1; $i

  066 $array = $this->getLunarByBetween($year,$this->getDaysBetweenSolar($year, $month, $i, $yearData[1],$yearData[2]));

  067 $array[] = $year . '-' . $month . '-' . $i;

  068 $lunar_ary[$i] = $array;

  069 }

  070 return $lunar_ary;

  071 }

  072 /**

  073 * 判断是否是闰年

  074 * @param year

  075 */

  076 function isLeapYear($year){

  077 return (($year%4==0 && $year%100 !=0) || ($year%400==0));

  078 }

  079 /**

  080 * 获取干支纪年

  081 * @param year

  082 */

  083 function getLunarYearName($year){

  084 $sky = array('庚','辛','壬','癸','甲','乙','丙','丁','戊','己');

  085 $earth = array('申','酉','戌','亥','子','丑','寅','卯','辰','巳','午','未');

  086 $year = $year.'';

  087 return $sky[$year{3}].$earth[$year%12];

  088 }

  089 /**

  090 * 根据阴历年获取生肖

  091 * @param year 阴历年

  092 */

  093 function getYearZodiac($year){

  094 $zodiac = array('猴','鸡','狗','猪','鼠','牛','虎','兔','龙','蛇','马','羊');

  095 return $zodiac[$year%12];

  096 }

  097 /**

  098 * 将阴历转换为阳历

  099 * @param year 阴历-年

  100 * @param month 阴历-月,闰月处理:例如如果当年闰五月,那么第二个五月就传六月,相当于阴历有13个月,只是有的时候第13个月的天数为0

  101 * @param date 阴历-日

  102 */

  103 function convertLunarToSolar($year,$month,$date){

  104 $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];

  105 $between = $this->getDaysBetweenLunar($year,$month,$date);

  106 $res = mktime(0,0,0,$yearData[1],$yearData[2],$year);

  107 $res = date('Y-m-d', $res+$between*24*60*60);

  108 $day = explode('-', $res);

  109 $year = $day[0];

  110 $month= $day[1];

  111 $day = $day[2];

  112 return array($year, $month, $day);

  113 }

  114 /**

  115 * 获取阳历月份的天数

  116 * @param year 阳历-年

  117 * @param month 阳历-月

  118 */

  119 function getSolarMonthDays($year,$month){

  120 $monthHash = array('1'=>31,'2'=>$this->isLeapYear($year)?29:28,'3'=>31,'4'=>30,'5'=>31,'6'=>30,'7'=>31,'8'=>31,'9'=>30,'10'=>31,'11'=>30,'12'=>31);

  121 return $monthHash["$month"];

  122 }

  123 /**

  124 * 获取阴历月份的天数

  125 * @param year 阴历-年

  126 * @param month 阴历-月,从一月开始

  127 */

  128 function getLunarMonthDays($year,$month){

  129 $monthData = $this->getLunarMonths($year);

  130 return $monthData[$month-1];

  131 }

  132 /**

  133 * 获取阴历每月的天数的数组

  134 * @param year

  135 */

  136 function getLunarMonths($year){

  137 $yearData = $this->lunarInfo[$year - $this->MIN_YEAR];

  138 $leapMonth = $yearData[0];

  139 $bit = decbin($yearData[3]);

  140 for ($i = 0; $i

  141 $bitArray[$i] = substr($bit, $i, 1);

  142 }

  143 for($k=0,$klen=16-count($bitArray);$k

  144 array_unshift($bitArray, '0');

  145 }

  146 $bitArray = array_slice($bitArray,0,($leapMonth==0?12:13));

  147 for($i=0; $i

  148 $bitArray[$i] = $bitArray[$i] + 29;

  149 }

  150 return $bitArray;

  151 }

  152 /**

  153 * 获取农历每年的天数

  154 * @param year 农历年份

  155 */

  156 function getLunarYearDays($year){

  157 $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];

  158 $monthArray = $this->getLunarYearMonths($year);

  159 $len = count($monthArray);

  160 return ($monthArray[$len-1]==0?$monthArray[$len-2]:$monthArray[$len-1]);

  161 }

  162 function getLunarYearMonths($year){

  163 //debugger;

  164 $monthData = $this->getLunarMonths($year);

  165 $res=array();

  166 $temp=0;

  167 $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];

  168 $len = ($yearData[0]==0?12:13);

  169 for($i=0;$i

  170 $temp=0;

  171 for($j=0;$j

  172 $temp+=$monthData[$j];

  173 }

  174 array_push($res, $temp);

  175 }

  176 return $res;

  177 }

  178 /**

  179 * 获取闰月

  180 * @param year 阴历年份

  181 */

  182 function getLeapMonth($year){

  183 $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];

  184 return $yearData[0];

  185 }

  186 /**

  187 * 计算阴历日期与正月初一相隔的天数

  188 * @param year

  189 * @param month

  190 * @param date

  191 */

  192 function getDaysBetweenLunar($year,$month,$date){

  193 $yearMonth = $this->getLunarMonths($year);

  194 $res=0;

  195 for($i=1;$i

  196 $res +=$yearMonth[$i-1];

  197 }

  198 $res+=$date-1;

  199 return $res;

  200 }

  201 /**

  202 * 计算2个阳历日期之间的天数

  203 * @param year 阳历年

  204 * @param cmonth

  205 * @param cdate

  206 * @param dmonth 阴历正月对应的阳历月份

  207 * @param ddate 阴历初一对应的阳历天数

  208 */

  209 function getDaysBetweenSolar($year,$cmonth,$cdate,$dmonth,$ddate){

  210 $a = mktime(0,0,0,$cmonth,$cdate,$year);

  211 $b = mktime(0,0,0,$dmonth,$ddate,$year);

  212 return ceil(($a-$b)/24/3600);

  213 }

  214 /**

  215 * 根据距离正月初一的天数计算阴历日期

  216 * @param year 阳历年

  217 * @param between 天数

  218 */

  219 function getLunarByBetween($year,$between){

  220 //debugger;

  221 $lunarArray = array();

  222 $yearMonth=array();

  223 $t=0;

  224 $e=0;

  225 $leapMonth=0;

  226 $m='';

  227 if($between==0){

  228 array_push($lunarArray, $year,'正月','初一');

  229 $t = 1;

  230 $e = 1;

  231 }else{

  232 $year = $between>0? $year : ($year-1);

  233 $yearMonth = $this->getLunarYearMonths($year);

  234 $leapMonth = $this->getLeapMonth($year);

  235 $between = $between>0?$between : ($this->getLunarYearDays($year)+$between);

  236 for($i=0;$i

  237 if($between==$yearMonth[$i]){

  238 $t=$i+2;

  239 $e=1;

  240 break;

  241 }else if($between

  242 $t=$i+1;

  243 $e=$between-(empty($yearMonth[$i-1])?0:$yearMonth[$i-1])+1;

  244 break;

  245 }

  246 }

  247 $m = ($leapMonth!=0&&$t==$leapMonth+1)?('闰'.$this->getCapitalNum($t- 1,true)):$this->getCapitalNum(($leapMonth!=0&&$leapMonth+1

  248 $my_year = $this->toYear($year);

  249 array_push($lunarArray,$my_year,$m,$this->getCapitalNum($e,false));

  250 }

  251 array_push($lunarArray,$this->getLunarYearName($year));// 天干地支

  252 array_push($lunarArray,$t,$e);

  253 array_push($lunarArray,$this->getYearZodiac($year));// 12生肖

  254 array_push($lunarArray,$leapMonth);// 闰几月

  255 return $lunarArray;

  256 }

  257 //转换成中文年份

  258 function toYear($year){

  259 $arr = array("零","一","二","三","四","五","六","七","八","九");

  260 $year_arr = str_split($year);

  261 $str = $arr[$year_arr[0]].$arr[$year_arr[1]].$arr[$year_arr[2]].$arr[$year_arr[3]];

  262 return $str;

  263 }

  264 /**

  265 * 获取数字的阴历叫法

  266 * @param num 数字

  267 * @param isMonth 是否是月份的数字

  268 */

  269 function getCapitalNum($num,$isMonth){

  270 $isMonth = $isMonth || false;

  271 $dateHash=array('0'=>'','1'=>'一','2'=>'二','3'=>'三','4'=>'四','5'=>'五','6'=>'六','7'=>'七','8'=>'八','9'=>'九','10'=>'十 ');

  272 $monthHash=array('0'=>'','1'=>'正月','2'=>'二月','3'=>'三月','4'=>'四月','5'=>'五月','6'=>'六月','7'=>'七月','8'=>'八月','9'=>'九月','10'=>'十月','11'=>'冬月','12'=>'腊月');

  273 $res='';

  274 if($isMonth){

  275 $res = $monthHash[$num];

  276 }else{

  277 if($num

  278 $res = '初'.$dateHash[$num];

  279 }else if($num>10&&$num

  280 $res = '十'.$dateHash[$num-10];

  281 }else if($num==20){

  282 $res = "二十";

  283 }else if($num>20&&$num

  284 $res = "廿".$dateHash[$num-20];

  285 }else if($num==30){

  286 $res = "三十";

  287 }

  288 }

  289 return $res;

  290 }

  291}

  292?>

  请将上面的代码保存为:Lunar.class.php,下面的例子将会调用这个文件,告诉你使用方法。

  01

  02require_once("Lunar.class.php");//先包含这个文件

  03$lunar = new Lunar();//生成对象

  04$date = $lunar->convertLunarToSolar(2014,2,12); //公历转农历

  05$date = $lunar->getYearZodiac(2014,2,12); //根据阴历年获取生肖

  06$date = $lunar->isLeapYear(2014,2,12); //判断闰年

  07//其它功能也是这种调用方法

  08print_r($date);

  09//如果是农历转公历,代码如下:

  10$date = $lunar->convertLunarToSolar(2014,2,12); //农历转公历

  11print_r($date);

  12?>

  其实里面的一些功能可以单独接出来当作函数用,不需要的可以删除。

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器