Php implements the conversion of the Gregorian calendar, and php implements the Gregorian calendar. Php implements the interactive method of the Gregorian calendar. php is more interested in the algorithm of the conversion from the Gregorian calendar to the lunar calendar recently, so it searches the Internet. Good way to achieve the conversion of solar calendars in php, and achieve the conversion of solar calendars in php
Recently, I was interested in the algorithm used to convert the Gregorian calendar to the lunar calendar, so I searched the internet. Yes, I found a pretty good php class. I realized the algorithm of converting the Gregorian calendar to the lunar calendar, and converting the Gregorian calendar to the Gregorian calendar. at the same time, I was able to get, and the corresponding Chinese name of the lunar calendar. the functions are quite complete and we will share with you here.
The specific class code is as follows:
Class Lunar {var $ MIN_YEAR = 1891; var $ MAX_YEAR = 2100; var $ lunarInfo = array (,), array, 17,9584), array (,), array ), array (,), array, 16, 53856), array (, 1 3,22176), array (, rows 32), array ), array (,), array, 11,38320), array (,), array ), array (,), array (,) 8256), array (,), array ), array (,), array, ), array ), array (,), array (,) 4), array (,), array ), array (,), array, ), array ), array ), Array (,), array, 3,42192), array (,), array ), array (,), array (, 2, ), array (,), Rray (,), array (,), array, ), array ), array (,), array, ), array (,), array (,), Array, 10, 44368), array ), array (,), array (), array (,), array, ), array (,), array (5, 59696,), array (,), array ), array (,), array (, 1, 24, 55968), array (,), array (, rows), array ), array (,), array (0, 27936,), array (,), array ), array (,), array, ), array (, 17,54432 ), array (,), array (, 3, 42704), array (,), array ), array (,), array, ), array ), array (24,211,), array (,) 04), array (,), array ), array (, rows), array, 55592), array )); /*** convert the Gregorian calendar to the Gregorian calendar * @ param year Gregorian calendar-year * @ param month Gregorian calendar-month * @ param date Gregorian calendar-day */function convertSolarToLunar ($ year, $ month, $ date) {// debugger; $ yearData = $ this-> l UnarInfo [$ year-$ this-> MIN_YEAR]; if ($ year = $ this-> MIN_YEAR & $ month <= 2 & $ date <= 9) {return array (1891, 'February 11', '1st 1', 'sinmao ', lunar January, '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 ar Ray (1891, 'October 11', '1st 1', 'sinmao ', 'rabbit');} $ month_days_ary = array (, 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_a Ry;}/*** converts the lunar calendar to the Gregorian calendar * @ param year lunar calendar-year * @ param month lunar calendar-month, and the leap month processing: for example, if the current year expires on January 1, May, in this case, the second month is set to 13th, which is equivalent to 13 months in the lunar calendar, but sometimes the number of days in the second month is 0 * @ param date in the lunar calendar-day */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 = explo De ('-', $ res); $ year = $ day [0]; $ month = $ day [1]; $ day = $ day [2]; return array ($ year, $ month, $ day);}/*** determine whether it is a leap year * @ param year */function isLeapYear ($ year) {return ($ year % 4 = 0 & $ year % 100! = 0) | ($ year % 400 = 0);}/*** obtain the year of the credit calculation * @ param year */function getLunarYearName ($ year) {$ sky = array ('geng ', 'sin', 'Shen', 'cap', 'A', 'B', 'Bing', 'ding ', 'pente', 'jid'); $ earth = array ('shen', 'uni', 'Shanghai', 'sub', 'ug ', 'yin ', 'Mao', 'Chen ', 'Si', 'Wu ', 'Wei'); $ year = $ year. ''; return $ sky [$ year {3}]. $ earth [$ year % 12];}/*** obtain the zodiac sign based on the lunar year * @ param year lunar year */function getYearZodiac ($ year) {$ zodiac = array ('Monkey ', 'Chicken', 'dog', 'pig', 'Rat ', 'ox', 'Tiger ', 'rabbit ', 'Long', 'Snake ', 'M', 'Yang'); return $ Zodiac [$ year % 12];} /*** get the number of days of the calendar month * @ param year Gregorian calendar-year * @ param month Gregorian calendar-month */function getSolarMonthDays ($ year, $ month) {$ 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 ); return $ monthHash ["$ month"];}/*** get the number of days of the calendar month * @ param year lunar calendar-year * @ param month lunar calendar-month, starting from January 1, January */function getLunarMonthDays ($ year, $ month) {$ monthData = $ this-> getLunarMonths ($ year); return $ monthData [$ month-1];} /*** obtain the array of the number of days of the calendar month * @ param year */function getLunarMonths ($ year) {$ yearData = $ this-> lunarInfo [$ year-$ this-> MIN_YEAR]; $ leapMonth = $ yearData [0]; $ bit = decbin ($ yearData [3]); for ($ I = 0; $ I
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 a leap month * @ param year lunar year */function getLeapMonth ($ year) {$ yearData = $ this-> lunarInfo [$ year-$ this-> MIN_YEAR]; return $ yearData [0];}/*** calculate the number of days between the lunar calendar date and January 1, lunar January 1 * @ param year * @ param month * @ param date */function getDaysBetweenLunar ($ year, $ month, $ date) {$ yearMonth = $ thi S-> getLunarMonths ($ year); $ res = 0; for ($ I = 1; $ I <$ month; $ I ++) {$ res + = $ yearMonth [$ i-1];} $ res + = $ date-1; return $ res ;} /*** calculate the number of days between two calendar dates * @ param year calendar year * @ param cmonth * @ param cdate * @ param dmonth the calendar month corresponding to January 1, lunar January * @ param ddate the number of calendar days corresponding to the first day */function getDaysBetweenSolar ($ year, $ cmonth, $ cdate, $ dmonth, $ ddate) {$ a = mktime (0, 0, $ cmonth, $ cdate, $ year); $ B = mktime (0, 0, 0, $ dmonth, $ ddate, $ year); return ceil (($ A-$ B)/24/3600 );} /*** calculate the lunar calendar date by the number of days from January 1, lunar January 1 * @ param year/function getLunarByBetween ($ year, $ between) {// debugger; $ lunarArray = array (); $ yearMonth = array (); $ t = 0; $ e = 0; $ leapMonth = 0; $ m = ''; if ($ between = 0) {array_push ($ lunarArray, $ year, 'August 1', '1n1'); $ 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 )? ('Authorization'. $ 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); // array_push ($ lunarArray, $ t, $ e); array_push ($ lunarArray, $ this-> getYearZodiac ($ year); // 12 Zodiac array_push ($ lunarArray, $ leapMonth); // returns $ lunarArray ;} /*** obtain the digit's lunar name * @ param num number * @ param isMonth is the number of the month */function getCapitalNum ($ num, $ isMonth) {$ isMonth = $ isMonth | false; $ dateHash = array ('0' => '', '1' => '1 ', '2' => '2', '3' => '3', '4' => '4', '5' => '5 ', '6' => '6', '7' => '7', '8' => '8', '9' => '9 ', '10' => '10'); $ monthHash = array ('0' => '', '1' => 'August 1 ', '2' => 'August 11', '3' => 'August 11', '4' => 'August 11', '5' => 'August 11 ', '6' => 'August 11', '7' => 'August 11', '8' => 'August 11', '9' => 'August 11 ', '10' => 'August 11', '11' => 'August 11', '12' => 'August 11'); $ res = ''; if ($ isMonth) {$ res = $ monthHash [$ num];} else {if ($ num <= 10) {$ res = 'chu '. $ dateHash [$ num];} else if ($ num> 10 & $ num <20) {$ res = '10 '. $ dateHash [$ num-10];} else if ($ num = 20) {$ res = "20";} else if ($ num> 20 & $ num <30) {$ res = "Hangzhou ". $ dateHash [$ num-20];} else if ($ num = 30) {$ res = "thirty" ;}} return $ res ;}}
The usage is as follows:
<? Php header ("Content-Type: text/html; charset = utf-8"); $ lunar = new Lunar (); $ month = $ lunar-> convertSolarToLunar (, 08 ); // Convert the Gregorian calendar to the Lunar echo''; print_r($month);
The output is as follows:
Array
(
[0] = & gt; 2013
[1] => May
[2] => thirty
[3] => Si
[4] => 5
[5] => 30
[6] => snake
[7] => 0
)
Recently, I was interested in the algorithm of converting the Gregorian calendar to the lunar calendar to get the corresponding holiday, so I searched the internet. Good...