- /*
- * Lunar Solar Festival
- * edit:bbs.it-home.org
- */
- 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 the Gregorian calendar to lunar calendar
- * @param year Gregorian calendar-years
- * @param month Gregorian-monthly
- * @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, ' The lunar month ', ' the ' 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->min_year&& $month <=2&& $date <=9) {
- Return Array (1891, ' The lunar month ', ' the ' 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;
- }
- /**
- * Convert lunar calendar to solar calendar
- * @param year lunar calendar-years
- * @param monthly 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->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));
- }
- /**
- * Get Ganzhi
- * @param year
- */
- function Getlunaryearname ($year) {
- $sky = Array (' g ', ' xin ', ' ren ', ' decyl ', ' A ', ' B ', ' C ', ' ding ', ' e ', ' own ');
- $earth = Array (' shen ', ' unitary ', ' Xu ', ' hai ', ' zi ', ' ugly ', ' Yin ', ' Mao ', ' Chen ', ' have ', ' noon ', ' not ');
- $year = $year. ";
- return $sky [$year {3}]. $earth [$year%12];
- }
- /**
- * Get Zodiac according to lunar year
- * @param year Overcast
- */
- function Getyearzodiac ($year) {
- $zodiac = Array (' monkey ', ' chicken ', ' dog ', ' pig ', ' rat ', ' cow ', ' tiger ', ' Rabbit ', ' dragon ', ' snake ', ' horse ', ' sheep ');
- return $zodiac [$year%12];
- }
- /**
- * Get the days of the Gregorian month
- * @param year Gregorian calendar-years
- * @param month Solar-moon
- */
- 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, ' ten ' =>31, ' one ' =>30, ' one ' =>31 ';
- return $monthHash ["$month"];
- }
- /**
- * Get the number of days of the lunar month
- * @param year lunar calendar-years
- * @param month Lunar calendar-months, starting from January
- */
- function Getlunarmonthdays ($year, $month) {
- $monthData = $this->getlunarmonths ($year);
- return $monthData [$month-1];
- }
- /**
- * Get an array of days of the lunar month
- * @param year
- */
- function Getlunarmonths ($year) {
- $yearData = $this->lunarinfo[$year-$this->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
- $bitArray [$i] = $bitArray [$i] + 29;
- }
- return $bitArray;
- }
- /**
- * Get lunar calendar days per year
- * @param year of the lunar calendar
- */
- 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 lunar Year
- */
- function Getleapmonth ($year) {
- $yearData = $this->lunarinfo[$year-$this->min_year];
- return $yearData [0];
- }
- /**
- * Calculate the number of days between lunar date and the day of the month
- * @param year
- * @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 the Gregorian month of Dmonth lunar month
- * @param the Gregorian calendar days of the Ddate lunar day
- */
- function Getdaysbetweensolar ($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);
- }
- /**
- * The lunar date is calculated based on the number of days from the month
- * @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, ' 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-(Emptyempty ($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 Branches
- Array_push ($lunarArray, $t, $e);
- Array_push ($lunarArray, $this->getyearzodiac ($year));//12 Zodiac
- Array_push ($lunarArray, $leapMonth);//Leap months
- return $lunarArray;
- }
- /**
- * Get numbers on the lunar calendar
- * @param num Number
- * @param Ismonth is the number of months
- */
- function Getcapitalnum ($num, $isMonth) {
- $isMonth = $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 ', ' one ' = ' ' Lunar ';
- $res = ";
- if ($isMonth) {
- $res = $monthHash [$num];
- }else{
- if ($num <=10) {
- $res = ' At the beginning '. $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;
- }
- /*
- * Throttle General algorithm
- */
- function Getjieqi ($_year, $month, $day)
- {
- $year = substr ($_year,-2) +0;
- $coefficient = Array (
- Array (5.4055,2019,-1),//Xiaohan
- Array (20.12,2082,1),//Big Chill
- Array (3.87),//Spring
- Array (18.74,2026,-1),//Rain
- Array (5.63),//Jingzhe
- Array (20.646,2084,1),//Vernal equinox
- Array (4.81),//Qingming
- Array (20.1),//Gu Yu
- Array (5.52,1911,1),//Li Xia Zhong
- Array (21.04,2008,1),//Xiaoman
- Array (5.678,1902,1),//Mang Chong
- Array (21.37,1928,1),//Summer Solstice
- Array (7.108,2016,1),//Slight heat
- Array (22.83,1922,1),//Great heat
- Array (7.5,2002,1),//beginning of Autumn
- Array (23.13),//Chushu
- Array (7.646,1927,1),//White Dew
- Array (23.042,1942,1),//Autumnal Equinox
- Array (8.318),//Dew
- Array (23.438,2089,1),//Frost
- Array (7.438,2089,1),//Winter
- Array (22.36,1978,1),//Snow
- Array (7.18,1954,1),//Snow
- Array (21.94,2021,-1)//Winter Solstice
- );
- $term _name = Array (
- "Xiaohan", "Big Chill", "beginning of Spring", "Rain", "Jingzhe", "Vernal Equinox", "Qingming", "Gu Yu",
- "Li Xia Zhong", "Xiaoman", "Mang Chong", "Summer solstice", "slight heat", "Great Heat", "the beginning of Autumn", "Chushu",
- "White Dew", "Autumnal Equinox", "Dew", "Frost", "Winter", "Snow", "Snow", "Winter Solstice");
- $idx 1 = ($month-1) * *;
- $_leap_value = Floor (($year-1)/4);
- $day 1 = Floor ($year *0.2422+ $coefficient [$idx 1][0])-$_leap_value;
- if (Isset ($coefficient [$idx 1][1]) && $coefficient [$idx 1][1]==$_year)
- {
- $day 1 + = $coefficient [$idx];
- }
- $day 2 = Floor ($year *0.2422+ $coefficient [$idx 1+1][0])-$_leap_value;
- if (Isset ($coefficient [$idx 1+1][1]) && $coefficient [$idx 1+1][1]==$_year)
- {
- $day 1 + = $coefficient [$idx 1+1][2];
- }
- echo __file__. ' '. __line__. ' $day 1= '. $day 1, ', $day 2= '. $day 2. '
'. Chr (10);
- if ($day = = $day 1) return $term _name[$idx 1];
- if ($day = = $day 2) return $term _name[$idx];
- Return ';
- }
- /*
- * Get Festivals: Special Festivals You can only modify this function to calculate
- */
- function Getfestival ($today, $nl _info = False, $config = 1)
- {
- if ($config = = 1)
- {
- $arr _lunar=array (' 01-01 ' = ' Spring Festival ', ' 01-15 ' and ' Lantern Festival ', ' 02-02 ' = ' two ', ' 05-05 ' and ' Dragon Boat Festival ', ' 07-07 ' and ' Tanabata festival ', ' 08-15 ' + ' Mid-Autumn Festival ', ' 09-09 ' + ' Chung Yeung Festival ', ' 12-08 ' and ' Laba Festival ', ' 12-23 ' = ' off-the-moon ';
- $arr _solar=array (' 01-01 ' = ' New Year ', ' 02-14 ' and ' Valentine's Day ', ' 03-12 ' + ' Arbor Day ', ' 04-01 ' = ' April Fool ', ' 05-01 ' and ' Labour ', ' 06-01 ' = ' children's Day ', ' 10-01 ' and ' National holiday ', ' 10-31 ' and ' Halloween ', ' 12-24 ' and ' Eve ', ' 12-25 ' and ' Christmas ';
- }//need different festivals, with different $config, then configure $arr_lunar and $arr_solar
- $festivals = Array ();
- List ($y, $m, $d) = Explode ('-', $today);
- if (! $nl _info) $nl _info = $this->convertsolartolunar ($y, Intval ($m), Intval ($d));
- if ($nl _info[7]>0&& $nl _info[7]< $nl _info[4]) $nl _info[4]-=1;
- $MD _lunar = substr (' 0 '. $nl _info[4],-2). ' -'. substr (' 0 '. $NL _info[5],-2);
- $MD _solar=substr_replace ($today, ", 0,5);
- Isset ($arr _lunar[$md _lunar]) Array_push ($festivals, $arr _lunar[$md _lunar]): ";
- Isset ($arr _solar[$md _solar]) Array_push ($festivals, $arr _solar[$md _solar]): ";
- $glweek = Date ("W", Strtotime ($today)); 0-6
- if ($m ==5&& ($d >7) && ($d <15) && ($glweek ==0)) Array_push ($festivals, "Mother's Day");
- if ($m ==6&& ($d >14) && ($d <22) && ($glweek ==0)) Array_push ($festivals, "Father's Day");
- $jieqi = $this->getjieqi ($y, $m, $d);
- if ($jieqi) Array_push ($festivals, $jieqi);
- Return implode ('/', $festivals);
- }
- }
- Header ("Content-type:text/html;charset=utf-8");
- $lunar =new lunar ();//
- $month = $lunar->convertsolartolunar (2013,07,08);//convert Gregorian to Lunar
- Echo '
'; - Print_r ($month);
Copy CodePrinting results: Array ([0] = [1] = May [2] = 30 [3] = [4] = 5 [5] = [6] = = Snake [7] = 0) |