程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP日期操作類代碼-農歷-陽歷轉換、閏年、計算天數等

PHP日期操作類代碼-農歷-陽歷轉換、閏年、計算天數等

編輯:關於PHP編程

       這是一個實用的PHP日期時間操作類,裡面包括了公歷-農歷轉換、轉換成中文日期格式、計算農歷相隔天數、根據陰歷年獲取生肖、獲取陰歷月份的天數、獲取農歷每年的天數、獲取閏月、計算陰歷日期與正月初一相隔的天數、計算2個公歷(陽歷)日期之間的天數、根據距離正月初一的天數計算陰歷日期、獲取天干地支紀年等,PHP日期操作類:Lunar.class.php代碼如下:

      001

      002class Lunar {

      003 var $MIN_YEAR = 1891;

      004 var $MAX_YEAR = 2100;

      005 var $lunarInfo = array(

      006 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),

      007 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),

      008 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),

      009 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),

      010 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),

      011 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),

      012 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),

      013 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),

      014 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),

      015 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),

      016 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),

      017 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),

      018 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),

      019 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),

      020 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),

      021 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),

      022 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),

      023 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),

      024 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),

      025 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),

      026 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),

      027 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),

      028 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),

      029 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),

      030 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),

      031 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),

      032 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),

      033 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),

      034 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),

      035 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),

      036 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),

      037 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),

      038 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),

      039 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),

      040 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)

      041 );

      042 /**

      043 * 將陽歷轉換為陰歷

      044 * @param year 公歷-年

      045 * @param month 公歷-月

      046 * @param date 公歷-日

      047 */

      048 function convertSolarToLunar($year,$month,$date){

      049 //debugger;

      050 $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];

      051 if($year==$this->MIN_YEAR&&$month<=2&&$date<=9){

      052 return array(1891,'正月','初一','辛卯',1,1,'兔');

      053 }

      054 return $this->getLunarByBetween($year,$this->getDaysBetweenSolar($year,$month,$date,$yearData[1],$yearData[2]));

      055 }

      056 function convertSolarMonthToLunar($year,$month) {

      057 $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];

      058 if($year==$this->MIN_YEAR&&$month<=2&&$date<=9){

      059 return array(1891,'正月','初一','辛卯',1,1,'兔');

      060 }

      061 $month_days_ary = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

      062 $dd = $month_days_ary[$month];

      063 if($this->isLeapYear($year) && $month == 2) $dd++;

      064 $lunar_ary = array();

      065 for ($i = 1; $i < $dd; $i++) {

      066 $array = $this->getLunarByBetween($year,$this->getDaysBetweenSolar($year, $month, $i, $yearData[1],$yearData[2]));

      067 $array[] = $year . '-' . $month . '-' . $i;

      068 $lunar_ary[$i] = $array;

      069 }

      070 return $lunar_ary;

      071 }

      072 /**

      073 * 判斷是否是閏年

      074 * @param year

      075 */

      076 function isLeapYear($year){

      077 return (($year%4==0 && $year%100 !=0) || ($year%400==0));

      078 }

      079 /**

      080 * 獲取干支紀年

      081 * @param year

      082 */

      083 function getLunarYearName($year){

      084 $sky = array('庚','辛','壬','癸','甲','乙','丙','丁','戊','己');

      085 $earth = array('申','酉','戌','亥','子','丑','寅','卯','辰','巳','午','未');

      086 $year = $year.'';

      087 return $sky[$year{3}].$earth[$year%12];

      088 }

      089 /**

      090 * 根據陰歷年獲取生肖

      091 * @param year 陰歷年

      092 */

      093 function getYearZodiac($year){

      094 $zodiac = array('猴','雞','狗','豬','鼠','牛','虎','兔','龍','蛇','馬','羊');

      095 return $zodiac[$year%12];

      096 }

      097 /**

      098 * 將陰歷轉換為陽歷

      099 * @param year 陰歷-年

      100 * @param month 陰歷-月,閏月處理:例如如果當年閏五月,那麼第二個五月就傳六月,相當於陰歷有13個月,只是有的時候第13個月的天數為0

      101 * @param date 陰歷-日

      102 */

      103 function convertLunarToSolar($year,$month,$date){

      104 $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];

      105 $between = $this->getDaysBetweenLunar($year,$month,$date);

      106 $res = mktime(0,0,0,$yearData[1],$yearData[2],$year);

      107 $res = date('Y-m-d', $res+$between*24*60*60);

      108 $day = explode('-', $res);

      109 $year = $day[0];

      110 $month= $day[1];

      111 $day = $day[2];

      112 return array($year, $month, $day);

      113 }

      114 /**

      115 * 獲取陽歷月份的天數

      116 * @param year 陽歷-年

      117 * @param month 陽歷-月

      118 */

      119 function getSolarMonthDays($year,$month){

      120 $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);

      121 return $monthHash["$month"];

      122 }

      123 /**

      124 * 獲取陰歷月份的天數

      125 * @param year 陰歷-年

      126 * @param month 陰歷-月,從一月開始

      127 */

      128 function getLunarMonthDays($year,$month){

      129 $monthData = $this->getLunarMonths($year);

      130 return $monthData[$month-1];

      131 }

      132 /**

      133 * 獲取陰歷每月的天數的數組

      134 * @param year

      135 */

      136 function getLunarMonths($year){

      137 $yearData = $this->lunarInfo[$year - $this->MIN_YEAR];

      138 $leapMonth = $yearData[0];

      139 $bit = decbin($yearData[3]);

      140 for ($i = 0; $i < strlen($bit);$i ++) {

      141 $bitArray[$i] = substr($bit, $i, 1);

      142 }

      143 for($k=0,$klen=16-count($bitArray);$k<$klen;$k++){

      144 array_unshift($bitArray, '0');

      145 }

      146 $bitArray = array_slice($bitArray,0,($leapMonth==0?12:13));

      147 for($i=0; $i

      148 $bitArray[$i] = $bitArray[$i] + 29;

      149 }

      150 return $bitArray;

      151 }

      152 /**

      153 * 獲取農歷每年的天數

      154 * @param year 農歷年份

      155 */

      156 function getLunarYearDays($year){

      157 $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];

      158 $monthArray = $this->getLunarYearMonths($year);

      159 $len = count($monthArray);

      160 return ($monthArray[$len-1]==0?$monthArray[$len-2]:$monthArray[$len-1]);

      161 }

      162 function getLunarYearMonths($year){

      163 //debugger;

      164 $monthData = $this->getLunarMonths($year);

      165 $res=array();

      166 $temp=0;

      167 $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];

      168 $len = ($yearData[0]==0?12:13);

      169 for($i=0;$i<$len;$i++){

      170 $temp=0;

      171 for($j=0;$j<=$i;$j++){

      172 $temp+=$monthData[$j];

      173 }

      174 array_push($res, $temp);

      175 }

      176 return $res;

      177 }

      178 /**

      179 * 獲取閏月

      180 * @param year 陰歷年份

      181 */

      182 function getLeapMonth($year){

      183 $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];

      184 return $yearData[0];

      185 }

      186 /**

      187 * 計算陰歷日期與正月初一相隔的天數

      188 * @param year

      189 * @param month

      190 * @param date

      191 */

      192 function getDaysBetweenLunar($year,$month,$date){

      193 $yearMonth = $this->getLunarMonths($year);

      194 $res=0;

      195 for($i=1;$i<$month;$i++){

      196 $res +=$yearMonth[$i-1];

      197 }

      198 $res+=$date-1;

      199 return $res;

      200 }

      201 /**

      202 * 計算2個陽歷日期之間的天數

      203 * @param year 陽歷年

      204 * @param cmonth

      205 * @param cdate

      206 * @param dmonth 陰歷正月對應的陽歷月份

      207 * @param ddate 陰歷初一對應的陽歷天數

      208 */

      209 function getDaysBetweenSolar($year,$cmonth,$cdate,$dmonth,$ddate){

      210 $a = mktime(0,0,0,$cmonth,$cdate,$year);

      211 $b = mktime(0,0,0,$dmonth,$ddate,$year);

      212 return ceil(($a-$b)/24/3600);

      213 }

      214 /**

      215 * 根據距離正月初一的天數計算陰歷日期

      216 * @param year 陽歷年

      217 * @param between 天數

      218 */

      219 function getLunarByBetween($year,$between){

      220 //debugger;

      221 $lunarArray = array();

      222 $yearMonth=array();

      223 $t=0;

      224 $e=0;

      225 $leapMonth=0;

      226 $m='';

      227 if($between==0){

      228 array_push($lunarArray, $year,'正月','初一');

      229 $t = 1;

      230 $e = 1;

      231 }else{

      232 $year = $between>0? $year : ($year-1);

      233 $yearMonth = $this->getLunarYearMonths($year);

      234 $leapMonth = $this->getLeapMonth($year);

      235 $between = $between>0?$between : ($this->getLunarYearDays($year)+$between);

      236 for($i=0;$i<13;$i++){

      237 if($between==$yearMonth[$i]){

      238 $t=$i+2;

      239 $e=1;

      240 break;

      241 }else if($between<$yearMonth[$i]){

      242 $t=$i+1;

      243 $e=$between-(empty($yearMonth[$i-1])?0:$yearMonth[$i-1])+1;

      244 break;

      245 }

      246 }

      247 $m = ($leapMonth!=0&&$t==$leapMonth+1)?('閏'.$this->getCapitalNum($t- 1,true)):$this->getCapitalNum(($leapMonth!=0&&$leapMonth+1<$t?($t-1):$t),true);

      248 $my_year = $this->toYear($year);

      249 array_push($lunarArray,$my_year,$m,$this->getCapitalNum($e,false));

      250 }

      251 array_push($lunarArray,$this->getLunarYearName($year));// 天干地支

      252 array_push($lunarArray,$t,$e);

      253 array_push($lunarArray,$this->getYearZodiac($year));// 12生肖

      254 array_push($lunarArray,$leapMonth);// 閏幾月

      255 return $lunarArray;

      256 }

      257 //轉換成中文年份

      258 function toYear($year){

      259 $arr = array("零","一","二","三","四","五","六","七","八","九");

      260 $year_arr = str_split($year);

      261 $str = $arr[$year_arr[0]].$arr[$year_arr[1]].$arr[$year_arr[2]].$arr[$year_arr[3]];

      262 return $str;

      263 }

      264 /**

      265 * 獲取數字的陰歷叫法

      266 * @param num 數字

      267 * @param isMonth 是否是月份的數字

      268 */

      269 function getCapitalNum($num,$isMonth){

      270 $isMonth = $isMonth || false;

      271 $dateHash=array('0'=>'','1'=>'一','2'=>'二','3'=>'三','4'=>'四','5'=>'五','6'=>'六','7'=>'七','8'=>'八','9'=>'九','10'=>'十 ');

      272 $monthHash=array('0'=>'','1'=>'正月','2'=>'二月','3'=>'三月','4'=>'四月','5'=>'五月','6'=>'六月','7'=>'七月','8'=>'八月','9'=>'九月','10'=>'十月','11'=>'冬月','12'=>'臘月');

      273 $res='';

      274 if($isMonth){

      275 $res = $monthHash[$num];

      276 }else{

      277 if($num<=10){

      278 $res = '初'.$dateHash[$num];

      279 }else if($num>10&&$num<20){

      280 $res = '十'.$dateHash[$num-10];

      281 }else if($num==20){

      282 $res = "二十";

      283 }else if($num>20&&$num<30){

      284 $res = "廿".$dateHash[$num-20];

      285 }else if($num==30){

      286 $res = "三十";

      287 }

      288 }

      289 return $res;

      290 }

      291}

      292?>

      請將上面的代碼保存為:Lunar.class.php,下面的例子將會調用這個文件,告訴你使用方法。

      01

      02require_once("Lunar.class.php");//先包含這個文件

      03$lunar = new Lunar();//生成對象

      04$date = $lunar->convertLunarToSolar(2014,2,12); //公歷轉農歷

      05$date = $lunar->getYearZodiac(2014,2,12); //根據陰歷年獲取生肖

      06$date = $lunar->isLeapYear(2014,2,12); //判斷閏年

      07//其它功能也是這種調用方法

      08print_r($date);

      09//如果是農歷轉公歷,代碼如下:

      10$date = $lunar->convertLunarToSolar(2014,2,12); //農歷轉公歷

      11print_r($date);

      12?>

      其實裡面的一些功能可以單獨接出來當作函數用,不需要的可以刪除。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved