首页 > 开发 > PHP > 正文

php实现的农历算法实例

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

这篇文章主要介绍了php实现的农历算法,较为详细的分析了农历算法的原理与php实现技巧,非常具有实用价值,需要的朋友可以参考下

本文实例讲述了php实现的农历算法。分享给大家供大家参考。具体如下:

 

 
  1. <?php 
  2. function lunarcalendar ($month$year
  3. global $lnlunarcalendar
  4. /** 
  5. * Lunar calendar 博大精深的农历 
  6. * 原始数据和算法思路来自 S&S 
  7. */ 
  8. /* 
  9. 农历每月的天数。 
  10. 每个元素为一年。每个元素中的数据为: 
  11. [0]是闰月在哪个月,0为无闰月; 
  12. [1]到[13]是每年12或13个月的每月天数; 
  13. [14]是当年的天干次序, 
  14. [15]是当年的地支次序 
  15. */ 
  16. $everymonth = array
  17. 0 => array(8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 30, 7, 1), 
  18. 1 => array(0, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 0, 8, 2), 
  19. 2 => array(0, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 0, 9, 3), 
  20. 3 => array(5, 29, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 10, 4), 
  21. 4 => array(0, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 0, 1, 5), 
  22. 5 => array(0, 30, 30, 29, 30, 30, 29, 29, 30, 29, 30, 29, 30, 0, 2, 6), 
  23. 6 => array(4, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 3, 7), 
  24. 7 => array(0, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 4, 8), 
  25. 8 => array(0, 30, 29, 29, 30, 30, 29, 30, 29, 30, 30, 29, 30, 0, 5, 9), 
  26. 9 => array(2, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 30, 6, 10), 
  27. 10 => array(0, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 0, 7, 11), 
  28. 11 => array(6, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 8, 12), 
  29. 12 => array(0, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 0, 9, 1), 
  30. 13 => array(0, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 0, 10, 2), 
  31. 14 => array(5, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 29, 30, 1, 3), 
  32. 15 => array(0, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 0, 2, 4), 
  33. 16 => array(0, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 3, 5), 
  34. 17 => array(2, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 4, 6), 
  35. 18 => array(0, 30, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 0, 5, 7), 
  36. 19 => array(7, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 30, 6, 8), 
  37. 20 => array(0, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 0, 7, 9), 
  38. 21 => array(0, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 0, 8, 10), 
  39. 22 => array(5, 30, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 9, 11), 
  40. 23 => array(0, 29, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0, 10, 12), 
  41. 24 => array(0, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 29, 0, 1, 1), 
  42. 25 => array(4, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 2, 2), 
  43. 26 => array(0, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0, 3, 3), 
  44. 27 => array(0, 30, 29, 29, 30, 29, 30, 29, 30, 29, 30, 30, 30, 0, 4, 4), 
  45. 28 => array(2, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 30, 5, 5), 
  46. 29 => array(0, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 0, 6, 6), 
  47. 30 => array(6, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 7, 7), 
  48. 31 => array(0, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0, 8, 8), 
  49. 32 => array(0, 30, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0, 9, 9), 
  50. 33 => array(5, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 29, 30, 10, 10), 
  51. 34 => array(0, 29, 30, 29, 30, 30, 29, 30, 29, 30, 30, 29, 30, 0, 1, 11), 
  52. 35 => array(0, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0, 2, 12), 
  53. 36 => array(3, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 30, 29, 3, 1), 
  54. 37 => array(0, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 0, 4, 2), 
  55. 38 => array(7, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 5, 3), 
  56. 39 => array(0, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0, 6, 4), 
  57. 40 => array(0, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0, 7, 5), 
  58. 41 => array(6, 30, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 8, 6), 
  59. 42 => array(0, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 0, 9, 7), 
  60. 43 => array(0, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 10, 8), 
  61. 44 => array(4, 30, 29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 1, 9), 
  62. 45 => array(0, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 30, 0, 2, 10), 
  63. 46 => array(0, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 0, 3, 11), 
  64. 47 => array(2, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 4, 12), 
  65. 48 => array(0, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0, 5, 1), 
  66. 49 => array(7, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 6, 2), 
  67. 50 => array(0, 29, 30, 30, 29, 30, 30, 29, 29, 30, 29, 30, 29, 0, 7, 3), 
  68. 51 => array(0, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 0, 8, 4), 
  69. 52 => array(5, 29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 9, 5), 
  70. 53 => array(0, 29, 30, 29, 29, 30, 30, 29, 30, 30, 29, 30, 29, 0, 10, 6), 
  71. 54 => array(0, 30, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 0, 1, 7), 
  72. 55 => array(3, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 2, 8), 
  73. 56 => array(0, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 0, 3, 9), 
  74. 57 => array(8, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29, 4, 10), 
  75. 58 => array(0, 30, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0, 5, 11), 
  76. 59 => array(0, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 0, 6, 12), 
  77. 60 => array(6, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 7, 1), 
  78. 61 => array(0, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 0, 8, 2), 
  79. 62 => array(0, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0, 9, 3), 
  80. 63 => array(4, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 10, 4), 
  81. 64 => array(0, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 0, 1, 5), 
  82. 65 => array(0, 29, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 0, 2, 6), 
  83. 66 => array(3, 30, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 3, 7), 
  84. 67 => array(0, 30, 30, 29, 30, 30, 29, 29, 30, 29, 30, 29, 30, 0, 4, 8), 
  85. 68 => array(7, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 5, 9), 
  86. 69 => array(0, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 6, 10), 
  87. 70 => array(0, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 0, 7, 11), 
  88. 71 => array(5, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 30, 8, 12), 
  89. 72 => array(0, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 0, 9, 1), 
  90. 73 => array(0, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 0, 10, 2), 
  91. 74 => array(4, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 1, 3), 
  92. 75 => array(0, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 0, 2, 4), 
  93. 76 => array(8, 30, 30, 29, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 3, 5), 
  94. 77 => array(0, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 29, 0, 4, 6), 
  95. 78 => array(0, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 5, 7), 
  96. 79 => array(6, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 6, 8), 
  97. 80 => array(0, 30, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 0, 7, 9), 
  98. 81 => array(0, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 0, 8, 10), 
  99. 82 => array(4, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 9, 11), 
  100. 83 => array(0, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 0, 10, 12), 
  101. 84 => array(10, 30, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 1, 1), 
  102. 85 => array(0, 29, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0, 2, 2), 
  103. 86 => array(0, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 29, 0, 3, 3), 
  104. 87 => array(6, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 29, 4, 4), 
  105. 88 => array(0, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0, 5, 5), 
  106. 89 => array(0, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 30, 0, 6, 6), 
  107. 90 => array(5, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 30, 7, 7), 
  108. 91 => array(0, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 0, 8, 8), 
  109. 92 => array(0, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 0, 9, 9), 
  110. 93 => array(3, 29, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 10, 10), 
  111. 94 => array(0, 30, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0, 1, 11), 
  112. 95 => array(8, 29, 30, 30, 29, 30, 29, 30, 30, 29, 29, 30, 29, 30, 2, 12), 
  113. 96 => array(0, 29, 30, 29, 30, 30, 29, 30, 29, 30, 30, 29, 29, 0, 3, 1), 
  114. 97 => array(0, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0, 4, 2), 
  115. 98 => array(5, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 29, 30, 5, 3), 
  116. 99 => array(0, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 0, 6, 4), 
  117. 100 => array(0, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 0, 7, 5), 
  118. 101 => array(4, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 8, 6), 
  119. 102 => array(0, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0, 9, 7), 
  120. 103 => array(0, 30, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 0, 10, 8), 
  121. 104 => array(2, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 1, 9), 
  122. 105 => array(0, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 2, 10), 
  123. 106 => array(7, 30, 29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 3, 11), 
  124. 107 => array(0, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 30, 0, 4, 12), 
  125. 108 => array(0, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 0, 5, 1), 
  126. 109 => array(5, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 6, 2), 
  127. 110 => array(0, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0, 7, 3), 
  128. 111 => array(0, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0, 8, 4), 
  129. 112 => array(4, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 9, 5), 
  130. 113 => array(0, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 0, 10, 6), 
  131. 114 => array(9, 29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 1, 7), 
  132. 115 => array(0, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 30, 29, 0, 2, 8), 
  133. 116 => array(0, 30, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 0, 3, 9), 
  134. 117 => array(6, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 4, 10), 
  135. 118 => array(0, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 0, 5, 11), 
  136. 119 => array(0, 30, 29, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 0, 6, 12), 
  137. 120 => array(4, 29, 30, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 7, 1) 
  138. ); 
  139. $mten = $lnlunarcalendar['tiangan'];// 农历天干 
  140. $mtwelve = $lnlunarcalendar['dizhi'];// 农历地支 
  141. $mmonth = $lnlunarcalendar['month'];// 农历月份 
  142. $mday = $lnlunarcalendar['day'];// 农历日 
  143. // 阳历总天数 至1900年12月21日 
  144. $total = 69 * 365 + 17 + 11; 
  145. //1970年1月1日前的就不算了 
  146. if ($year == "" || $month == "" || ($year < 1970 or $year > 2020)) return ''//超出这个范围不计算 
  147. // 计算到所求日期阳历的总天数-自1900年12月21日始 
  148. for ($y = 1970; $y < $year;$y++) {// 先算年的和 
  149. $total += 365; 
  150. if ($y % 4 == 0) $total ++; 
  151. // 再加当年的几个月 
  152. $total += gmdate("z"gmmktime(0, 0, 0, $month, 1, $year)); 
  153. // 用农历的天数累加来判断是否超过阳历的天数 
  154. $flag1 = 0; //判断跳出循环的条件 
  155. $lcj = 0; 
  156. while ($lcj <= 120) { 
  157. $lci = 1; 
  158. while ($lci <= 13) { 
  159. @$mtotal += $everymonth[$lcj][$lci]; 
  160. if ($mtotal >= $total) { 
  161. $flag1 = 1; 
  162. break
  163. $lci++; 
  164. if ($flag1 == 1) break
  165. $lcj++; 
  166. // 由上,得到的 $lci 为当前农历月, $lcj 为当前农历年 
  167. // 计算所求月份1号的农历日期 
  168. $fisrtdaylunar = $everymonth[$lcj][$lci] - ($mtotal - $total); 
  169. $results['year'] = $mten[$everymonth[$lcj][14]] . $mtwelve[$everymonth[$lcj][15]]; //当前是什么年 
  170. $daysthismonth = gmdate("t"gmmktime(0, 0, 0, $month, 1, $year)); //当前月共几天 
  171. $op = 1; 
  172. for ($i = 1; $i <= $daysthismonth$i++) { 
  173. $possiblelunarday = $fisrtdaylunar + $op-1; //理论上叠加后的农历日 
  174. if ($possiblelunarday <= $everymonth[$lcj][$lci]) { // 在本月的天数范畴内 
  175. $results[$i] = $mday[$possiblelunarday]; 
  176. $op += 1; 
  177. else { // 不在本月的天数范畴内 
  178. $results[$i] = $mday[1]; //退回到1日 
  179. $fisrtdaylunar = 1; 
  180. $op = 2; 
  181. $curmonthnum = ($everymonth[$lcj][0] != 0) ? 13 : 12; //当年有几个月 
  182. if ($lci + 1 > $curmonthnum) { // 第13/14个月了,转到下一年 
  183. $lci = 1; 
  184. $lcj = $lcj + 1; 
  185. // 换年头了,把新一年的天干地支也写上 
  186. $results['year'] .= '/' . $mten[$everymonth[$lcj][14]] . $mtwelve[$everymonth[$lcj][15]]; 
  187. else { // 还在这年里 
  188. $lci = $lci + 1; 
  189. $lcj = $lcj
  190. if ($results[$i] == $mday[1]) { // 每月的初一应该显示当月是什么月 
  191. if ($everymonth[$lcj][0] != 0) { // 有闰月的年 
  192. $monthss = ($lci > $everymonth[$lcj][0]) ? ($lci-1) : $lci//闰月后的月数-1 
  193. if ($lci == $everymonth[$lcj][0] + 1) { // 这个月正好是闰月 
  194. $monthssshow = $mmonth[0] . $mmonth[$monthss]; //前面加个闰字 
  195. $runyue = 1; 
  196. else { 
  197. $monthssshow = $mmonth[$monthss]; 
  198. else { 
  199. $monthss = $lci
  200. $monthssshow = $mmonth[$monthss]; 
  201. if ($monthss <= 10 && @$runyue != 1){ //只有1个字的月加上‘月'字 
  202. $monthssshow .= $mmonth[13]; 
  203. $results[$i] = $monthssshow
  204. return $results
  205. // 忘了加上这个:农历用字 
  206. $lnlunarcalendar = array
  207. 'tiangan' => array("未知""甲""乙""丙""丁""戊""己""庚""辛""壬""癸"), 
  208. 'dizhi' => array("未知""子年(鼠)""丑年(牛)""寅年(虎)""卯年(兔)""辰年(龙)"
  209. "巳年(蛇)""午年(马)""未年(羊)""申年(猴)""酉年(鸡)""戌年(狗)""亥年(猪)"), 
  210. 'month' => array("闰""正""二""三""四""五""六"
  211. "七""八""九""十""十一""十二""月"), 
  212. 'day' => array("未知""初一""初二""初三""初四""初五""初六""初七""初八""初九""初十"
  213. "十一""十二""十三""十四""十五""十六""十七""十八""十九""二十"
  214. "廿一""廿二""廿三""廿四""廿五""廿六""廿七""廿八""廿九""三十"
  215. ); 
  216. print_r(lunarcalendar(8,2015)); 

运行结果如下:

 

 
  1. Array 
  2. [year] => 乙未年(羊) 
  3. [1] => 十七 
  4. [2] => 十八 
  5. [3] => 十九 
  6. [4] => 二十 
  7. [5] => 廿一 
  8. [6] => 廿二 
  9. [7] => 廿三 
  10. [8] => 廿四 
  11. [9] => 廿五 
  12. [10] => 廿六 
  13. [11] => 廿七 
  14. [12] => 廿八 
  15. [13] => 廿九 
  16. [14] => 七月 
  17. [15] => 初二 
  18. [16] => 初三 
  19. [17] => 初四 
  20. [18] => 初五 
  21. [19] => 初六 
  22. [20] => 初七 
  23. [21] => 初八 
  24. [22] => 初九 
  25. [23] => 初十 
  26. [24] => 十一 
  27. [25] => 十二 
  28. [26] => 十三 
  29. [27] => 十四 
  30. [28] => 十五 
  31. [29] => 十六 
  32. [30] => 十七 
  33. [31] => 十八 

希望本文所述对大家的php程序设计有所帮助。

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