Php implementation of the conversion of the Gregorian and lunar calendars

Source: Internet
Author: User
This article mainly introduces how php implements the conversion of the Gregorian calendar and the Chinese name of the calendar, interested friends can refer to the recent study on the conversion of the Gregorian calendar to obtain the appropriate holiday algorithm, which is more interested, so they 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
)

Related Article

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

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.