The method of realizing the _php of the Gregorian calendar in PHP technique

Source: Internet
Author: User
Tags php class

Recently to the Gregorian calendar to get the corresponding festival of the algorithm is more interested in this, so I searched a circle on the Internet. Good, still be found a relatively good PHP class, the realization of the Gregorian calendar to convert to the lunar calendar (lunar calendar), the lunar calendar to convert the algorithm, but also to obtain the Ganzhi annals, Zodiac, and the corresponding lunar calendar in Chinese name, etc., the function is quite complete, here to share to everyone. The
Concrete 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 calendar-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 grade ', ' 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 the 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 is 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 lunar year * @param lunar Year/function Getyearzodiac ($year) {$zodiac =array (' monkey ', ' chicken ', ' dog ', ' pig ', ' mouse 
    ', ' ox ', ' tiger ', ' Rabbit ', ' dragon ', ' snake ', ' horse ', ' goat '. 
  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) { $monthHash =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 the lunar month * @param year lunar calendar-years * @param month lunar month, starting from January/function getlunarmonthdays ($year, $mont 
    h) {$monthData = $this->getlunarmonths ($year); 
  return $monthData [$month-1]; /** * Gets an array of days per month for the lunar calendar * @param year/function getlunarmonths ($year) {$yearData = $this->lunarinfo[$y 
    ear-$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 <count ($bitArray); $i + +) {$bitArray [$i]= $bitArray [$i] + 29; 
  return $bitArray; /** * Get the number of days of the lunar calendar * @param year lunar 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 date and the first 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 dmonth the Gregorian calendar month for the lunar month * @param ddate the Gregorian calendar days corresponding to the 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); /** * According to the number of days from the first day of the month to calculate the lunar date * @param year solar years * @param between days/function Getlunarbybetween ($year, $bet 
    Ween) {//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 
  $lunarArray; /** * Get the number of the lunar term * @param num number * @param ismonth is the number of months/function getcapitalNum ($num, $isMonth) {$isMonth = $isMonth | | 
    False $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 ();
$month = $lunar->convertsolartolunar (2013,07,08)//convert Gregorian calendar to the lunar calendar 
echo ' <pre> '; 

Print the results as follows:
Array
(
[0] => 2013
[1] => May
[2] => Eve
[3] =>
[4] => 5
[5] => 30
[6] => snake
[7] => 0
)

Related Article

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.