-
- /*
- * 农历 节气 节日
- * 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)
- );
- /**
- * 将阳历转换为阴历
- * @param year 公历-年
- * @param month 公历-月
- * @param date 公历-日
- */
- 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,'正月','初一','辛卯',1,1,'兔');
- }
- 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,'正月','初一','辛卯',1,1,'兔');
- }
- $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 - year
- * @param month lunar calendar - month, leap month processing: For example, if there is a leap month in May, then the second May will be passed to June, which is equivalent to 13 in the lunar calendar month, but sometimes the number of days in the 13th month is 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 whether it is a leap year
- * @param year
- */
- function isLeapYear($year){
- return (($year%4==0 && $year%100 !=0) || ($year%400==0));
- }
- /**
- * Get the year of the stems and branches
- * @param year
- */
- function getLunarYearName($year){
- $sky = array('庚','辛','壬','癸','甲','乙','丙','丁','戊','己');
- $earth = array('申','酉','戌','亥','子','丑','寅','卯','辰','巳','午','未');
- $year = $year.'';
- return $sky[$year{3}].$earth[$year%12];
- }
- /**
- * Get the zodiac sign according to the lunar year
- * @param year lunar year
- */
- function getYearZodiac($year){
- $zodiac = array('猴','鸡','狗','猪','鼠','牛','虎','兔','龙','蛇','马','羊');
- return $zodiac[$year%12];
- }
- /**
- * Get the number of days in the Gregorian 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 in the lunar month
- * @param year lunar calendar - year
- * @param month lunar calendar - month, starting from January
- */
- function getLunarMonthDays($year,$month){
- $monthData = $this->getLunarMonths($year);
- return $monthData[$month-1];
- }
- /**
- * Get the array of days in each month of the lunar calendar
- * @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 the number of days in each year 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 year
- */
- function getLeapMonth($year){
- $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];
- return $yearData[0];
- }
- /**
- * Calculate the number of days between the lunar date and the first day of the first lunar 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;
- }
- /**
- * Calculate the number of days between two solar calendar dates
- * @param year The solar calendar year
- * @param cmonth
- * @param cdate
- * @param dmonth The solar calendar month corresponding to the first month of the lunar calendar
- * @param ddate The solar calendar corresponding to the first day of the lunar calendar Number of days
- */
- 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);
- }
- /**
- * Calculate the lunar date based on the number of days from the first day of the first lunar month
- * @param year Gregorian 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,'正月','初一');
- $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)?('闰'.$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生肖
- array_push($lunarArray,$leapMonth);// 闰几月
- return $lunarArray;
- }
- /**
- * Get the lunar calendar name of the number
- * @param num number
- * @param isMonth whether it is the number of the month
- */
- 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','10'=>'Ten');
- $monthHash= array('0'=>'','1'=>'First month','2'=>'February','3'=>'March','4'=>' April','5'=>'May','6'=>'June','7'=>'July','8'=>'August','9 '=>'September','10'=>'October','11'=>'Winter Month','12'=>'Twelfth Month');
- $res='';
- if($isMonth){
- $res = $monthHash[$num];
- }else{
- if($num<=10){
- $res = 'Initial'.$dateHash[$num];
- }else if ($num>10&&$num<20){
- $res = '十'.$dateHash[$num-10];
- }else if($num==20){
- $res = "Twenty";
- }else if($num>20&&$num<30){
- $res = "忿".$dateHash[$num-20];
- }else if($num==30){
- $res = "Thirty" ";
- }
- }
- return $res;
- }
-
- /*
- * General algorithm for solar terms
- */
- function getJieQi($_year,$month,$day)
- {
- $year = substr($_year,- 2)+0;
- $coefficient = array(
- array(5.4055,2019,-1),//Xiaohan
- array(20.12,2082,1),//Dahan
- array(3.87),//The beginning of 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),// Guyu
- array(5.52,1911,1),//Lixia
- array(21.04,2008,1),//Xiaoman
- array(5.678,1902,1),//Mangzhong
- array(21.37,1928,1), //Summer Solstice
- array(7.108,2016,1),//Small Summer Season
- array(22.83,1922,1),//Great Summer Season
- array(7.5,2002,1),//Beginning of Autumn
- array(23.13),// Summer heat
- array(7.646,1927,1),//White dew
- array(23.042,1942,1),//Autumnal equinox
- array(8.318),//Cold dew
- array(23.438,2089,1),//Frostfall
- array(7.438,2089,1),//The beginning of winter
- array(22.36,1978,1),//Light snow
- array(7.18,1954,1),//Heavy snow
- array(21.94,2021,-1)// Winter Solstice
- );
- $term_name = array(
- "Little Cold", "Big Cold", "Beginning of Spring", "Rain", "Jingzhe", "Vernal Equinox", "Qingming", "Grain Rain",
- "Beginning of Summer", "Xiaoman" ","awn","summer solstice","little heat","big heat","beginning of autumn","end of heat",
- "white dew","autumnal equinox","cold dew","frost fall","beginning of winter","light snow" ,"Heavy Snow","Winter Solstice");
-
- $idx1 = ($month-1)*2;
- $_leap_value = floor(($year-1)/4);
-
- $day1 = floor($year* 0.2422+$coefficient[$idx1][0])-$_leap_value;
- if(isset($coefficient[$idx1][1])&&$coefficient[$idx1][1]==$_year)
- {
- $ day1 += $coefficient[$idx1][2];
- }
- $day2 = floor($year*0.2422+$coefficient[$idx1+1][0])-$_leap_value;
- if(isset($coefficient[ $idx1+1][1])&&$coefficient[$idx1+1][1]==$_year)
- {
- $day1 += $coefficient[$idx1+1][2];
- }
- // echo __FILE__.'->'.__LINE__.' $day1='.$day1,',$day2='.$day2.'
'.chr(10);
- if($day= =$day1) return $term_name[$idx1];
- if($day==$day2) return $term_name[$idx1+1];
- return '';
- }
-
- /*
- * Get festival: special festivals 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'=>'Lantern Festival','02-02'=>'February 2','05- 05'=>'Dragon Boat Festival','07-07'=>'Qixi Festival','08-15'=>'Mid-Autumn Festival','09-09'=>'Double Ninth Festival',' 12-08'=>'Laba Festival','12-23'=>'Little Year');
- $arr_solar=array('01-01'=>'New Year's Day','02-14'= >'Valentine's Day','03-12'=>'Arbor Day','04-01'=>'April Fool's Day','05-01'=>'Labor Day','06-01 '=>'Children's Day','10-01'=>'National Day','10-31'=>'Halloween','12-24'=>'Christmas Eve','12- 25'=>'Christmas');
- }//If you need different festivals, use different $config, and 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 solar calendar to lunar calendar
- echo '
';
- print_r($month);
Copy code
Print result:
Array
(
[0] => 2013
[1] => May
[2] => thirty
[3] => Guisi
[4] => 5
[5] => 30
[6] => snake
[7] => 0
) |