How PHP realizes the Gregorian lunar calendar

Source: Internet
Author: User
Tags php class php session
This article mainly introduces the method of implementing the Gregorian lunar calendar in PHP, and also can obtain the Ganzhi, Zodiac, and the corresponding lunar calendar Chinese names, etc., interested in small partners can refer to. We hope to help you.

Recently to the Gregorian calendar to get the corresponding holiday algorithm this is more interested in this aspect, so on the internet searched a circle. Good, but also to find a better PHP class, to achieve the conversion of the Gregorian calendar into the lunar calendar (lunar), the lunar calendar conversion to the Gregorian algorithm, but also to obtain the Ganzhi year, the Zodiac, and the corresponding lunar calendar of Chinese names and so on, the function is quite complete, here to share to everyone.
The specific class code is as follows:

Class lunar{var $MIN _year=1891;   var $MAX _year=2100; var $lunarInfo =array (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), 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), 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), 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), 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), 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), 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), Array ( 5,1,26,27976), Array (0,2,14,23248), Array (0,2,4,111), Array (3,1,24,37744), Array (0,2,11,37600), Array (7,1,31,51560), 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), 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), 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), 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 ), 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), 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), 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), 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), 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), 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), 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), 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), 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), 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 ), 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), 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), 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), 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), 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), 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), 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), 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), 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 ), 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), 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), 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), 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)); /** * Convert Gregorian to lunar Calendar * @param year Gregorian-years * @param month Gregorian-month * @param date Gregorian-day */function Convertsolartolunar ($year     , $month, $date) {//debugger;     $yearData = $this->lunarinfo[$year-$this->min_year]; if ($year = = $this->min_year&& $month <=2&& $date <=9) {return Array (1891, ' Lunar month ', ' Junior ', ' Xin Mao ', 1, 1, '     Rabbit '); } return $this->getlunarbybetween ($year, $this->getdaysbetweensolar ($year, $month, $date, $yearData [1],$   YEARDATA[2]));     } function Convertsolarmonthtolunar ($year, $month) {$yearData = $this->lunarinfo[$year-$this->min_year]; if ($year = = $this-&GT     min_year&& $month <=2&& $date <=9) {return Array (1891, ' Lunar month ', ' Junior ', ' Xin Mao ', 1, 1, ' Rabbit ');     } $month _days_ary=array (31,28,31,30,31,30,31,31,30,31,30,31);     $DD = $month _days_ary[$month];     if ($this->isleapyear ($year) && $month ==2) $dd + +;     $lunar _ary=array (); for ($i =1; $i < $dd; $i + +) {$array = $this->getlunarbybetween ($year, $this->getdaysbetweensolar ($year, $month, $       I, $yearData [1], $yearData [2]);       $array []= $year. '-'. $month. '-' $i;     $lunar _ary[$i]= $array;   } return $lunar _ary;  }/** * Converts the lunar calendar to Gregorian calendar * @param year Lunar calendar-years * @param month lunar calendar-month, leap months processing: For example, if the current year leap May, then the second May will be June, equivalent to the lunar calendar has 13 months, but sometimes the 13th month of the days of 0 * @param date Lunar calendar-day */function Convertlunartosolar ($year, $month, $date) {$yearData = $this->lunarinfo[$year-$this-& Gt     Min_year];     $between = $this->getdaysbetweenlunar ($year, $month, $date);     $res =mktime (0,0,0, $yearData [1], $yearData [2], $year);     $res =date (' y-m-d ', $res + $between *24*60*60); $day =explode ('-', $res);    $year = $day [0];     $month = $day [1];     $day = $day [2];   Return Array ($year, $month, $day); }/** * Determines if a leap year is @param year */function Isleapyear ($year) {return ($year%4==0&& $year%100!=0) | |   ($year%400==0)); }/** * Get Ganzhi Calendar * @param year */function Getlunaryearname ($year) {$sky =array (' g ', ' xin ', ' ren ', ' decyl ', ' A ', ' B ', ' C ', ' ding ')     , ' e ', ' own ');     $earth =array (' shen ', ' unitary ', ' Xu ', ' Hai ', ' son ', ' ugly ', ' Yin ', ' Mao ', ' Chen ', ' have ', ' noon ', ' not ');     $year = $year. ";   return $sky [$year {3}]. $earth [$year%12]; */** * @param year lunar Year * * for lunar calendar years */function Getyearzodiac ($year) {$zodiac =array (' monkey ', ' chicken ', ' dog ', ' pig ', ' rat ', ' cow ',     ' Tiger ', ' Rabbit ', ' dragon ', ' snake ', ' horse ', ' sheep ';   return $zodiac [$year%12]; }/** * Gets the number of days of the Gregorian month * @param year Gregorian-years * @param month Gregorian calendar-month */function getsolarmonthdays ($year, $month) {$mon Thhash=array (' 1 ' =>31, ' 2 ' = = $this->isleapyear ($year)? 29:28, ' 3 ' =>31, ' 4 ' =>30, ' 5 ' =>31, ' 6 ' =>30,     ' 7 ' =>31, ' 8 ' =>31, ' 9 ' =>30, ' ten ' =>31, ' one ' =>30, ' one ' =>31 '; Return $monthhash["$month"];     }/** * Gets the number of days of the lunar month * @param year lunar calendar-years * @param month lunar calendar-month, starting from January */function Getlunarmonthdays ($year, $month) {     $monthData = $this->getlunarmonths ($year);   return $monthData [$month-1]; /** * Gets an array of days of the lunar calendar per month * @param year */function getlunarmonths ($year) {$yearData = $this->lunarinfo[$year-$t     his->min_year];     $leapMonth = $yearData [0];     $bit =decbin ($yearData [3]);     for ($i =0; $i <strlen ($bit); $i + +) {$bitArray [$i]=substr ($bit, $i, 1);     } for ($k =0, $klen =16-count ($bitArray), $k < $klen; $k + +) {array_unshift ($bitArray, ' 0 ');     } $bitArray =array_slice ($bitArray, 0, ($leapMonth ==0?12:13));     for ($i =0; $i <count ($bitArray), $i + +) {$bitArray [$i]= $bitArray [$i] + 29;   } return $bitArray; }/** * Gets the number of days of the lunar calendar * @param year lunar Year */function Getlunaryeardays ($year) {$yearData = $this->lunarinfo[$yea     R-$this->min_year];     $monthArray = $this->getlunaryearmonths ($year); $len =count ($monTharray);   Return ($monthArray [$len -1]==0? $monthArray [$len-2]: $monthArray [$len-1]);     } function Getlunaryearmonths ($year) {//debugger;     $monthData = $this->getlunarmonths ($year);     $res =array ();     $temp = 0;     $yearData = $this->lunarinfo[$year-$this->min_year];     $len = ($yearData [0]==0?12:13);       for ($i =0; $i < $len; $i + +) {$temp = 0;       for ($j =0; $j <= $i; $j + +) {$temp + = $monthData [$j];     } array_push ($res, $temp);   } return $res; /** * Get Leap Month * @param year lunar years */function Getleapmonth ($year) {$yearData = $this->lunarinfo[$year-$this-& Gt     Min_year];   return $yearData [0]; /** * Calculates the number of days between lunar dates and the day of the month * @param year * @param month * @param date */function Getdaysbetweenlunar ($year, $m     Onth, $date) {$yearMonth = $this->getlunarmonths ($year);     $res = 0;     for ($i =1; $i < $month; $i + +) {$res + = $yearMonth [$i-1];     } $res + = $date-1;   return $res; */** * Calculates the number of days between 2 Gregorian dates * @param year Gregorian * @param cmonth * @param cdate * @param the Gregorian month of the Dmonth lunar month * @param the Gregorian days of the ddate lunar Calendar */function Getdaysbetweens     Olar ($year, $cmonth, $cdate, $dmonth, $ddate) {$a =mktime (0,0,0, $cmonth, $cdate, $year);     $b =mktime (0,0,0, $dmonth, $ddate, $year);   Return Ceil (($a-$b)/24/3600); /** * Calculates the lunar date based on the number of days from the day of the month * @param year Gregorian * @param between days */function Getlunarbybetween ($year, $between) {     Debugger     $lunarArray =array ();     $yearMonth =array ();     $t = 0;     $e = 0;     $leapMonth = 0;     $m = ";       if ($between ==0) {Array_push ($lunarArray, $year, ' The lunar month ', ' the Junior ');       $t = 1;     $e = 1;       }else{$year = $between >0? $year: ($year-1);       $yearMonth = $this->getlunaryearmonths ($year);       $leapMonth = $this->getleapmonth ($year);       $between = $between >0? $between: ($this->getlunaryeardays ($year) + $between);           for ($i =0; $i <13; $i + +) {if ($between = = $yearMonth [$i]) {$t = $i +2;           $e = 1;         Break }else if ($between< $yearMonth [$i]) {$t = $i +1;           $e = $between-(Empty ($yearMonth [$i-1])? 0: $yearMonth [$i-1]) +1;         Break }} $m = ($leapMonth!=0&& $t = = $leapMonth + 1)? (' Leap '. $this->getcapitalnum ($t -1,true)): $this->getcapitalnum (($leapMonth!=0&& $leapMonth +1< $t? (       $t-1): $t), true);     Array_push ($lunarArray, $year, $m, $this->getcapitalnum ($e, false));     } array_push ($lunarArray, $this->getlunaryearname ($year));//Zodiac earthly Array_push ($lunarArray, $t, $e); Array_push ($lunarArray, $this->getyearzodiac ($year));//12 Zodiac Array_push ($lunarArray, $leapMonth);//Leap months return $l   Unararray; }/** * Gets the number of the lunar term * @param num number * @param whether Ismonth is the number of months */function Getcapitalnum ($num, $isMonth) {$isM Onth= $isMonth | |     False $dateHash =array (' 0 ' = ', ' 1 ' = ' one ', ' 2 ' = ' two ', ' 3 ' = ' three ', ' 4 ' = ' Four ', ' 5 ' = ' five ', ' 6 ' = ' Six ', ' 7 ' = ' Seven '     , ' 8 ' = ' eight ', ' 9 ' = ' nine ', ' ten ' = ' x '; $monthHash =array (' 0 ' = ', ' 1 ' = ' The lunar month ', ' 2 ' =>' February ', ' 3 ' = ' March ', ' 4 ' = ' April ', ' 5 ' = ' May ', ' 6 ' = ' June ', ' 7 ' = ' July ', ' 8 ' = ' August ', ' 9 ' = ' September ', ' ten ' = ' October ', '     One ' = ' = ' Winter months ', ' a ' and ' ['];     $res = ";     if ($isMonth) {$res = $monthHash [$num];       }else{if ($num <=10) {$res = ' early '. $dateHash [$num];       }else if ($num >10&& $num <20) {$res = ' ten '. $dateHash [$num-10];       }else if ($num ==20) {$res = "20";       }else if ($num >20&& $num <30) {$res = "20". $dateHash [$num-20];       }else if ($num ==30) {$res = "30";   }} return $res; } }

Here's how to use it:

<?php header ("Content-type:text/html;charset=utf-8"); $lunar =new lunar () $month = $lunar->convertsolartolunar (2013,07,08);//Convert the Gregorian calendar to the lunar echo ' <pre> '; Print_r ($month);

The printing results are as follows:
Array
(
[0] = 2013
[1] = May
[2] = Eve
[3] =
[4] = 5
[5] = 30
[6] = snake
[7] = 0
)

Related recommendations:

PHP Session Anti-Serialization vulnerability detailed

How to implement comment reply delete function in PHP

How PHP bulk modifies table structure

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.