首页 > 开发 > PHP > 正文

php实现阳历阴历互转的方法

2024-05-04 23:39:56
字体:
来源:转载
供稿:网友

这篇文章主要介绍了php实现阳历阴历互转的方法,同时还能获取干支纪年,生肖,以及相应的阴历的中文叫法等,感兴趣的小伙伴们可以参考一下

最近对阳历转阴历从而得到相应节日的算法这方面比较感兴趣,于是就在网上搜了一圈。不错,还算是找到一个比较不错的php类,实现了将阳历转换为阴历(农历),阴历转换为阳历的算法,同时还能获取干支纪年,生肖,以及相应的阴历的中文叫法等等,功能还是挺齐全的,在这里分享给大家。

具体类代码如下:

 

 
  1. class Lunar{  
  2. var $MIN_YEAR=1891;  
  3. var $MAX_YEAR=2100;  
  4. var $lunarInfo=array(  
  5. 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),  
  6. 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),  
  7. 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),  
  8. 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),  
  9. 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),  
  10. 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),  
  11. 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),  
  12. 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),  
  13. 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),  
  14. 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),  
  15. 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),  
  16. 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),  
  17. 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),  
  18. 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),  
  19. 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),  
  20. 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),  
  21. 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),  
  22. 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),  
  23. 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),  
  24. 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),  
  25. 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),  
  26. 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),  
  27. 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),  
  28. 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),  
  29. 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),  
  30. 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),  
  31. 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),  
  32. 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),  
  33. 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),  
  34. 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),  
  35. 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),  
  36. 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),  
  37. 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),  
  38. 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),  
  39. 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)  
  40. );  
  41. /**  
  42. * 将阳历转换为阴历  
  43. * @param year 公历-年  
  44. * @param month 公历-月  
  45. * @param date 公历-日  
  46. */  
  47. function convertSolarToLunar($year,$month,$date){//debugger;  
  48. $yearData=$this->lunarInfo[$year-$this->MIN_YEAR];  
  49. if($year==$this->MIN_YEAR&&$month<=2&&$date<=9){  
  50. return array(1891,'正月','初一','辛卯',1,1,'兔');  
  51. }  
  52. return $this->getLunarByBetween($year,$this->getDaysBetweenSolar($year,$month,$date,$yearData[1],$yearData[2]));  
  53. }  
  54. function convertSolarMonthToLunar($year,$month){  
  55. $yearData=$this->lunarInfo[$year-$this->MIN_YEAR];  
  56. if($year==$this->MIN_YEAR&&$month<=2&&$date<=9){  
  57. return array(1891,'正月','初一','辛卯',1,1,'兔');  
  58. }  
  59. $month_days_ary=array(31,28,31,30,31,30,31,31,30,31,30,31);  
  60. $dd=$month_days_ary[$month];  
  61. if($this->isLeapYear($year)&& $month==2)$dd++;  
  62. $lunar_ary=array();  
  63. for ($i=1;$i<$dd;$i++){  
  64. $array=$this->getLunarByBetween($year,$this->getDaysBetweenSolar($year,$month,$i,$yearData[1],$yearData[2]));  
  65. $array[]=$year.'-'.$month.'-'.$i;  
  66. $lunar_ary[$i]=$array;  
  67. }  
  68. return $lunar_ary;  
  69. }  
  70. /**  
  71. * 将阴历转换为阳历  
  72. * @param year 阴历-年  
  73. * @param month 阴历-月,闰月处理:例如如果当年闰五月,那么第二个五月就传六月,相当于阴历有13个月,只是有的时候第13个月的天数为0  
  74. * @param date 阴历-日  
  75. */  
  76. function convertLunarToSolar($year,$month,$date){  
  77. $yearData=$this->lunarInfo[$year-$this->MIN_YEAR];  
  78. $between=$this->getDaysBetweenLunar($year,$month,$date);  
  79. $res=mktime(0,0,0,$yearData[1],$yearData[2],$year);  
  80. $res=date('Y-m-d',$res+$between*24*60*60);  
  81. $day=explode('-',$res);  
  82. $year=$day[0];  
  83. $month=$day[1];  
  84. $day=$day[2];  
  85. return array($year,$month,$day);  
  86. }  
  87. /**  
  88. * 判断是否是闰年  
  89. * @param year  
  90. */  
  91. function isLeapYear($year){  
  92. return (($year%4==0&&$year%100!=0)||($year%400==0));  
  93. }  
  94. /**  
  95. * 获取干支纪年  
  96. * @param year  
  97. */  
  98. function getLunarYearName($year){  
  99. $sky=array('庚','辛','壬','癸','甲','乙','丙','丁','戊','己');  
  100. $earth=array('申','酉','戌','亥','子','丑','寅','卯','辰','巳','午','未');  
  101. $year=$year.'';  
  102. return $sky[$year{3}].$earth[$year%12];  
  103. }  
  104. /**  
  105. * 根据阴历年获取生肖  
  106. * @param year 阴历年  
  107. */  
  108. function getYearZodiac($year){  
  109. $zodiac=array('猴','鸡','狗','猪','鼠','牛','虎','兔','龙','蛇','马','羊');  
  110. return $zodiac[$year%12];  
  111. }  
  112. /**  
  113. * 获取阳历月份的天数  
  114. * @param year 阳历-年  
  115. * @param month 阳历-月  
  116. */  
  117. function getSolarMonthDays($year,$month){  
  118. $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);  
  119. return $monthHash["$month"];  
  120. }  
  121. /**  
  122. * 获取阴历月份的天数  
  123. * @param year 阴历-年  
  124. * @param month 阴历-月,从一月开始  
  125. */  
  126. function getLunarMonthDays($year,$month){  
  127. $monthData=$this->getLunarMonths($year);  
  128. return $monthData[$month-1];  
  129. }  
  130. /**  
  131. * 获取阴历每月的天数的数组  
  132. * @param year  
  133. */  
  134. function getLunarMonths($year){  
  135. $yearData=$this->lunarInfo[$year-$this->MIN_YEAR];  
  136. $leapMonth=$yearData[0];  
  137. $bit=decbin($yearData[3]);  
  138. for ($i=0;$i<strlen($bit);$i ++){  
  139. $bitArray[$i]=substr($bit,$i,1);  
  140. }  
  141. for($k=0,$klen=16-count($bitArray);$k<$klen;$k++){  
  142. array_unshift($bitArray,'0');  
  143. }  
  144. $bitArray=array_slice($bitArray,0,($leapMonth==0?12:13));  
  145. for($i=0;$i<count($bitArray);$i++){  
  146. $bitArray[$i]=$bitArray[$i] + 29;  
  147. }  
  148. return $bitArray;  
  149. }  
  150. /**  
  151. * 获取农历每年的天数  
  152. * @param year 农历年份  
  153. */  
  154. function getLunarYearDays($year){  
  155. $yearData=$this->lunarInfo[$year-$this->MIN_YEAR];  
  156. $monthArray=$this->getLunarYearMonths($year);  
  157. $len=count($monthArray);  
  158. return ($monthArray[$len-1]==0?$monthArray[$len-2]:$monthArray[$len-1]);  
  159. }  
  160. function getLunarYearMonths($year){//debugger;  
  161. $monthData=$this->getLunarMonths($year);  
  162. $res=array();  
  163. $temp=0;  
  164. $yearData=$this->lunarInfo[$year-$this->MIN_YEAR];  
  165. $len=($yearData[0]==0?12:13);  
  166. for($i=0;$i<$len;$i++){  
  167. $temp=0;  
  168. for($j=0;$j<=$i;$j++){  
  169. $temp+=$monthData[$j];  
  170. }  
  171. array_push($res,$temp);  
  172. }  
  173. return $res;  
  174. }  
  175. /**  
  176. * 获取闰月  
  177. * @param year 阴历年份  
  178. */  
  179. function getLeapMonth($year){  
  180. $yearData=$this->lunarInfo[$year-$this->MIN_YEAR];  
  181. return $yearData[0];  
  182. }  
  183. /**  
  184. * 计算阴历日期与正月初一相隔的天数  
  185. * @param year  
  186. * @param month  
  187. * @param date  
  188. */  
  189. function getDaysBetweenLunar($year,$month,$date){  
  190. $yearMonth=$this->getLunarMonths($year);  
  191. $res=0;  
  192. for($i=1;$i<$month;$i++){  
  193. $res+=$yearMonth[$i-1];  
  194. }  
  195. $res+=$date-1;  
  196. return $res;  
  197. }  
  198. /**  
  199. * 计算2个阳历日期之间的天数  
  200. * @param year 阳历年  
  201. * @param cmonth  
  202. * @param cdate  
  203. * @param dmonth 阴历正月对应的阳历月份  
  204. * @param ddate 阴历初一对应的阳历天数  
  205. */  
  206. function getDaysBetweenSolar($year,$cmonth,$cdate,$dmonth,$ddate){  
  207. $a=mktime(0,0,0,$cmonth,$cdate,$year);  
  208. $b=mktime(0,0,0,$dmonth,$ddate,$year);  
  209. return ceil(($a-$b)/24/3600);  
  210. }  
  211. /**  
  212. * 根据距离正月初一的天数计算阴历日期  
  213. * @param year 阳历年  
  214. * @param between 天数  
  215. */  
  216. function getLunarByBetween($year,$between){//debugger;  
  217. $lunarArray=array();  
  218. $yearMonth=array();  
  219. $t=0;  
  220. $e=0;  
  221. $leapMonth=0;  
  222. $m='';  
  223. if($between==0){  
  224. array_push($lunarArray,$year,'正月','初一');  
  225. $t=1;  
  226. $e=1;  
  227. }else{  
  228. $year=$between>0? $year : ($year-1);  
  229. $yearMonth=$this->getLunarYearMonths($year);  
  230. $leapMonth=$this->getLeapMonth($year);  
  231. $between=$between>0?$between : ($this->getLunarYearDays($year)+$between);  
  232. for($i=0;$i<13;$i++){  
  233. if($between==$yearMonth[$i]){  
  234. $t=$i+2;  
  235. $e=1;  
  236. break;  
  237. }else if($between<$yearMonth[$i]){  
  238. $t=$i+1;  
  239. $e=$between-(empty($yearMonth[$i-1])?0:$yearMonth[$i-1])+1;  
  240. break;  
  241. }  
  242. }  
  243. $m=($leapMonth!=0&&$t==$leapMonth+1)?('闰'.$this->getCapitalNum($t- 1,true)):$this->getCapitalNum(($leapMonth!=0&&$leapMonth+1<$t?($t-1):$t),true);  
  244. array_push($lunarArray,$year,$m,$this->getCapitalNum($e,false));  
  245. }  
  246. array_push($lunarArray,$this->getLunarYearName($year));// 天干地支  
  247. array_push($lunarArray,$t,$e);  
  248. array_push($lunarArray,$this->getYearZodiac($year));// 12生肖  
  249. array_push($lunarArray,$leapMonth);// 闰几月  
  250. return $lunarArray;  
  251. }  
  252. /**  
  253. * 获取数字的阴历叫法  
  254. * @param num 数字  
  255. * @param isMonth 是否是月份的数字  
  256. */  
  257. function getCapitalNum($num,$isMonth){  
  258. $isMonth=$isMonth||false;  
  259. $dateHash=array('0'=>'','1'=>'一','2'=>'二','3'=>'三','4'=>'四','5'=>'五','6'=>'六','7'=>'七','8'=>'八','9'=>'九','10'=>'十 ');  
  260. $monthHash=array('0'=>'','1'=>'正月','2'=>'二月','3'=>'三月','4'=>'四月','5'=>'五月','6'=>'六月','7'=>'七月','8'=>'八月','9'=>'九月','10'=>'十月','11'=>'冬月','12'=>'腊月');  
  261. $res='';  
  262. if($isMonth){  
  263. $res=$monthHash[$num];  
  264. }else{  
  265. if($num<=10){  
  266. $res='初'.$dateHash[$num];  
  267. }else if($num>10&&$num<20){  
  268. $res='十'.$dateHash[$num-10];  
  269. }else if($num==20){  
  270. $res="二十";  
  271. }else if($num>20&&$num<30){  
  272. $res="廿".$dateHash[$num-20];  
  273. }else if($num==30){  
  274. $res="三十";  
  275. }  
  276. }  
  277. return $res;  
  278. }  

使用方法如下:

 

 
  1. <?php  
  2. header("Content-Type:text/html;charset=utf-8");  
  3. $lunar=new Lunar(); 
  4. $month=$lunar->convertSolarToLunar(2013,07,08);//将阳历转换为阴历  
  5. echo '<pre>';  
  6. print_r($month); 

打印结果如下:

Array

(

[0] => 2013

[1] => 五月

[2] => 三十

[3] => 癸巳

[4] => 5

[5] => 30

[6] => 蛇

[7] => 0

)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表