Since a recent project designed to convert the Gregorian calendar to the lunar calendar to get the corresponding holiday algorithm, this is not very understanding, so the online search a lap. Yes, but also to find a relatively good PHP class, the realization of the Gregorian calendar to convert to the lunar calendar (lunar), the lunar calendar converted to the Gregorian algorithm, but also to obtain the Ganzhi annals, Zodiac, and the corresponding lunar calendar in Chinese, etc.
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,11104), 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 calendar to lunar Calendar * @param year Gregorian calendar-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, ' First month ', ' first grade ', ' 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->min_year&& $month <=2&& $date <=9) {return array 1891, ' first month ', ' first ', ' XinMao ', 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; /** * Convert the lunar calendar to Gregorian calendar * @param year Lunar calendar-years * @param month lunar month, leap months processing: For example, if the year of May, then the second May on the June, the equivalent of the lunar calendar has 13 months, but sometimes the 13th month of the number of days 0 * @param date lunar-daily/function Convertlunartosolar ($year, $month, $date) {$yearData = $this->lunarinfo[$year-$this ;
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);
/** * Determine if it is a leap year * @param year * * function Isleapyear ($year) {return ($year%4==0&& $year%100!=0) ($year%400==0)); /** * Acquisition of Ganzhi Annals * @param year/function Getlunaryearname ($year) {$sky =array (' Geng ', ' xin ', ' Ren ', ' gui ', ' a ', ' B ', ' C ', ' Ding ', '
E ', ' self ');
$earth =array (' shen ', ' unitary ', ' Xu ', ' Hai ', ' son ', ' ugly ', ' Yin ', ' Mao ', ' Chen ', ' si ', ' afternoon ', ' not ');
$year = $year.
return $sky [$year {3}]. $earth [$year%12]; /** * According to the lunar year to get the Zodiac * @param year Lunar calendar years * * Function Getyearzodiac ($year) {$zodiac =array (' monkey ', ' chicken ', ' dog ', ' pig ', ' rat ', ' ox ', ' tiger ')
', ' Rabbit ', ' dragon ', ' snake ', ' horse ', ' sheep ';
return $zodiac [$year%12]; /** * Get the number of days of the Gregorian calendar * @param year Gregorian calendar-years * @param month Gregorian-monthly/function getsolarmonthdays ($year, $month) {$month Hash=array (' 1 ' =>31, ' 2 ' => $this->isleapyear ($year)? 29:28, ' 3 ' =>31, ' 4 ' =>30, ' 5 ' =>31, ' 6 ' =>30, '
7 ' =>31, ' 8 ' =>31, ' 9 ' =>30, ' =>31 ', ' One ' =>30, ' =>31 ';
return $monthHash ["$month"];
/** * Get the number of days of lunar month * @param year lunar calendar-years * @param month lunar month, starting from January/function getlunarmonthdays ($year, $month) { $monthData = $this->Getlunarmonths ($year);
return $monthData [$month-1]; /** * Gets an array of the number of days per month of the lunar calendar * @param year/function getlunarmonths ($year) {$yearData = $this->lunarinfo[$year-$thi
s->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; /** * Get the number of days of the lunar calendar * @param year Lunar New Year */function Getlunaryeardays ($year) {$yearData = $this->lunarinfo[$year-
$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 ;
Min_year];
return $yearData [0]; /** * Calculates the number of days between the lunar calendar and the first day of the month * @param year http://www. alixixi.com/* @param month * @param date/function Getdaysbetweenlunar ($year, $month, $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 @param cmonth * @param cdate * @param dmonth the Gregorian calendar month for the lunar month * @param d Date lunar calendar days corresponding to the Gregorian day/function Getdaysbetweensolar ($year, $cmonth, $cdate, $dmonth, $ddate) {$a =mktime (0,0,0, $cmonth, $CDA
TE, $year); $b =mktime (0,0,0, $dmonth, $dDate, $year);
Return Ceil (($a-$b)/24/3600); /** * Based on the number of days from the first day of the first month of the lunar calendar * @param year * @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, ' first month ', ' first grade ');
$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 = +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 Array_push ($lunarArray, $t, $e); Array_push ($lunarArray, $this->getyearzodiac ($year))//12 Zodiac Array_push ($lunarArray, $leapMonth),//leap a few months return $lu
Nararray; /** * Get the number of the lunar term * @param num number * @param ismonth is the number of months/function Getcapitalnum ($num, $isMonth) {$isMon
Th= $isMonthfalse; $dateHash =array (' 0 ' => ', ' 1 ' => ' one ', ' 2 ' => ' II ', ' 3 ' => ' III ', ' 4 ' => ' Four ', ' 5 ' => ', ' 6 ' => ', ' 7 ', ' => ', ' seven '
, ' 8 ' => ' eight ', ' 9 ' => ' nine ', ' => ' ten '); $monthHash =array (' 0 ' => ', ' 1 ' => ', ' 2 ' => ' February ', ' 3 ' => ' March ', ' 4 ' => ' April ', ' 5 ' => ' May ', ' 6 ' => ' June ', ' 7 ' =
> ' July ', ' 8 ' => ' August ', ' 9 ' => ' September ', ' => ' October ', ' One ' => ' winter months ', ' => '.
$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; }
}
Use the following methods:
<?php
Header ("Content-type:text/html;charset=utf-8");
$lunar =new lunar ();//http://www. alixixi.com/php-function/867.html
$month = $lunar->convertsolartolunar (2013,07,08);//convert Gregorian calendar to
lunar echo ' <pre> ';
Print_r ($month);
Print the results as follows:
Array
(
[0] => 2013
[1] => May
[2] => Eve
[3] =>
[4] => 5
[5] => 30
[6] => snake
[7] => 0
)
What does each element in a specific array mean, and here's no explanation.