The broad and profound lunar algorithm

Source: Internet
Author: User
/** * Lunar Calendar The profound lunar calendar * Raw data and algorithmic ideas from S&s Lab http://www.focus-2000.com Unfortunately, the site seems to be closed. */ /* The number of days of the lunar month. Each element is one year. The data in each element is: [0] is the leap month in which months, 0 for no leap month; [1] to [13] is each year 12 or 13 months of the monthly number of days; [14] is the zodiac order of the Year, [15] is the earthly order of the Year */
  1. function Lunarcalendar ($month, $year)
  2. {
  3. Global $lnlunarcalendar;
  4. /**
  5. * Lunar Calendar The profound lunar calendar
  6. * Raw data and algorithmic ideas from S&s
  7. Lab http://www.focus-2000.com Unfortunately, the site seems to be closed.
  8. */
  9. /*
  10. The number of days of the lunar month.
  11. Each element is one year. The data in each element is:
  12. [0] is the leap month in which months, 0 for no leap month;
  13. [1] to [13] is each year 12 or 13 months of the monthly number of days;
  14. [14] is the zodiac order of the Year,
  15. [15] is the earthly order of the Year
  16. */
  17. $everymonth = Array (
  18. 0 = Array (8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 30, 7, 1),
  19. 1 = Array (0, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 0, 8, 2),
  20. 2 = Array (0, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 0, 9, 3),
  21. 3 = Array (5, 29, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 10, 4),
  22. 4 = Array (0, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 0, 1, 5),
  23. 5 = Array (0, 30, 30, 29, 30, 30, 29, 29, 30, 29, 30, 29, 30, 0, 2, 6),
  24. 6 = Array (4, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 3, 7),
  25. 7 = Array (0, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 4, 8),
  26. 8 = Array (0, 30, 29, 29, 30, 30, 29, 30, 29, 30, 30, 29, 30, 0, 5, 9),
  27. 9 = Array (2, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 30, 6, 10),
  28. Ten = = Array (0, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 0, 7, 11),
  29. One by one = Array (6, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 8, 12),
  30. Array (0, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 0, 9, 1),
  31. Array (0, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 0, 10, 2),
  32. + = Array (5, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 29, 30, 1, 3),
  33. + = Array (0, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 0, 2, 4),
  34. + = Array (0, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 3, 5),
  35. + = Array (2, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 4, 6),
  36. + = Array (0, 30, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 0, 5, 7),
  37. + = Array (7, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 30, 6, 8),
  38. + = Array (0, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 0, 7, 9),
  39. + = Array (0, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 0, 8, 10),
  40. + = Array (5, 30, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 9, 11),
  41. + = Array (0, 29, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0, 10, 12),
  42. Array (0, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 29, 0, 1, 1),
  43. + = Array (4, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 2, 2),
  44. + = Array (0, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0, 3, 3),
  45. + = Array (0, 30, 29, 29, 30, 29, 30, 29, 30, 29, 30, 30, 30, 0, 4, 4),
  46. + = Array (2, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 30, 5, 5),
  47. + = Array (0, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 0, 6, 6),
  48. + = Array (6, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 7, 7),
  49. + = Array (0, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0, 8, 8),
  50. + = Array (0, 30, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0, 9, 9),
  51. = = Array (5, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 29, 30, 10, 10),
  52. + = Array (0, 29, 30, 29, 30, 30, 29, 30, 29, 30, 30, 29, 30, 0, 1, 11),
  53. Array (0, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0, 2, 12),
  54. The array (3, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 30, 29, 3, 1),
  55. Panax Notoginseng = Array (0, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 0, 4, 2),
  56. + = Array (7, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 5, 3),
  57. The "=" Array (0, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0, 6, 4),
  58. + = Array (0, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0, 7, 5),
  59. The array (6, 30, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 8, 6),
  60. 0, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 0, 9, 7,
  61. + = Array (0, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 10, 8),
  62. +-= Array (4, 30, 29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 1, 9),
  63. A/= Array (0, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 30, 0, 2, 10),
  64. + = Array (0, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 0, 3, 11),
  65. + = Array (2, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 4, 12),
  66. = = Array (0, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0, 5, 1),
  67. = = Array (7, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 6, 2),
  68. Array (0, 29, 30, 30, 29, 30, 30, 29, 29, 30, 29, 30, 29, 0, 7, 3),
  69. Wuyi = = Array (0, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 0, 8, 4),
  70. In the array (5, 29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 9, 5),
  71. + = Array (0, 29, 30, 29, 29, 30, 30, 29, 30, 30, 29, 30, 29, 0, 10, 6),
  72. The array (0, 30, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 0, 1, 7),
  73. + = Array (3, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 2, 8),
  74. + = Array (0, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 0, 3, 9),
  75. + = Array (8, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29, 4, 10),
  76. + = Array (0, 30, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0, 5, 11),
  77. (0, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 0, 6, 12),
  78. Array (6, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 7, 1),
  79. (0, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 0, 8, 2),
  80. + = Array (0, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0, 9, 3),
  81. + = Array (4, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 10, 4),
  82. + = Array (0, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 0, 1, 5),
  83. + = Array (0, 29, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 0, 2, 6),
  84. $ = Array (3, 30, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 3, 7),
  85. 0, 30, 30, 29, 30, 30, 29, 29, 30, 29, 30, 29, 30, 0, 4, 8,
  86. (7, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 5, 9),
  87. The array (0, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 6, 10),
  88. + = Array (0, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 0, 7, 11),
  89. + = Array (5, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 30, 8, 12),
  90. + = Array (0, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 0, 9, 1),
  91. (0, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 0, 10, 2),
  92. 4, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 1, 3,
  93. The array (0, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 0, 2, 4),
  94. + = Array (8, 30, 30, 29, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 3, 5),
  95. The + = Array (0, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 29, 0, 4, 6),
  96. + = Array (0, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 5, 7),
  97. + = Array (6, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 6, 8),
  98. + = Array (0, 30, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 0, 7, 9),
  99. Bayi = Array (0, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 0, 8, 10),
  100. (4, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 9, 11),
  101. The same as array (0, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 0, 10, 12),
  102. + = Array (10, 30, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 1, 1),
  103. $ = Array (0, 29, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0, 2, 2),
  104. + = Array (0, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 29, 0, 3, 3),
  105. The array (6, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 29, 4, 4),
  106. The array (0, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0, 5, 5),
  107. In the array (0, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 30, 0, 6, 6),
  108. + = Array (5, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 30, 7, 7),
  109. The 0, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 0, 8, 8,
  110. the "= =" Array (0, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 0, 9, 9),
  111. (3, 29, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 10, 10),
  112. 94 = = Array (0, 30, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0, 1, 11),
  113. The array (8, 29, 30, 30, 29, 30, 29, 30, 30, 29, 29, 30, 29, 30, 2, 12),
  114. + = Array (0, 29, 30, 29, 30, 30, 29, 30, 29, 30, 30, 29, 29, 0, 3, 1),
  115. $ = Array (0, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0, 4, 2),
  116. 98 = = Array (5, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 29, 30, 5, 3),
  117. (0, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 0, 6, 4),
  118. + = Array (0, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 0, 7, 5),
  119. 101 = = Array (4, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 8, 6),
  120. 102 = = Array (0, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0, 9, 7),
  121. 103 = = Array (0, 30, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 0, 10, 8),
  122. 104 = = Array (2, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 1, 9),
  123. + = Array (0, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 2, 10),
  124. 106 = = Array (7, 30, 29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 3, 11),
  125. 107 = = Array (0, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 30, 0, 4, 12),
  126. 108 = = Array (0, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 0, 5, 1),
  127. 109 = = Array (5, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 6, 2),
  128. + = Array (0, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0, 7, 3),
  129. 111 = = Array (0, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0, 8, 4),
  130. The array (4, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 9, 5),
  131. 113 = = Array (0, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 0, 10, 6),
  132. [+] Array (9, 29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 1, 7),
  133. (0, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 30, 29, 0, 2, 8),
  134. The $ = Array (0, 30, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 0, 3, 9),
  135. 117 = = Array (6, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 4, 10),
  136. 118 = = Array (0, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 0, 5, 11),
  137. 119 = = Array (0, 30, 29, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 0, 6, 12),
  138. + = Array (4, 29, 30, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 7, 1)
  139. );
  140. $mten = $lnlunarcalendar [' Tiangan '];//lunar zodiac
  141. $mtwelve = $lnlunarcalendar [' Dizhi '];//lunar earthly Branches
  142. $mmonth = $lnlunarcalendar [' Month '];//lunar month
  143. $mday = $lnlunarcalendar [' Day '];//lunar calendar
  144. Total Gregorian calendar days to December 21, 1900
  145. $total = 69 * 365 + 17 + 11;
  146. Not until January 1, 1970.
  147. if ($year = = "" | | $month = = "" | | ($year < 1970 or $year > 2020)) Return '; Beyond this range is not counted
  148. Total number of days to be calculated for the Gregorian calendar date-starting from December 21, 1900
  149. for ($y = 1970; $y < $year; $y + +) {//first-year and
  150. $total + = 365;
  151. if ($y% 4 = = 0) $total + +;
  152. }
  153. Plus a few months in the year.
  154. $total + = gmdate ("Z", gmmktime (0, 0, 0, $month, 1, $year));
  155. Use the number of days of the lunar calendar to determine whether to exceed the Gregorian calendar days
  156. $flag 1 = 0; Determine the conditions for jumping out of a loop
  157. $LCJ = 0;
  158. while ($LCJ <= 120) {
  159. $lci = 1;
  160. while ($lci <= 13) {
  161. $mtotal + = $everymonth [$LCJ] [$LCI];
  162. if ($mtotal >= $total) {
  163. $flag 1 = 1;
  164. Break
  165. }
  166. $lci + +;
  167. }
  168. if ($flag 1 = = 1) break;
  169. $LCJ + +;
  170. }
  171. From above, get the $LCI for the current lunar month, $LCJ for the current agricultural calendar year
  172. Calculate the lunar date for the 1th month
  173. $fisrtdaylunar = $everymonth [$LCJ] [$lci]-($mtotal-$total);
  174. $results [' year '] = $mten [$everymonth [$LCJ][14]]. $mtwelve [$everymonth [$LCJ][15]]; What year is it now?
  175. $daysthismonth = gmdate ("T", gmmktime (0, 0, 0, $month, 1, $year)); The current month a few days
  176. $op = 1;
  177. for ($i = 1; $i <= $daysthismonth; $i + +) {
  178. $possiblelunarday = $fisrtdaylunar + $op-1; The Chinese lunar day after the theory is superimposed
  179. if ($possiblelunarday <= $everymonth [$LCJ] [$lci]) {//within the days of the month
  180. $results [$i] = $mday [$possiblelunarday];
  181. $op + = 1;
  182. }
  183. else {//not within the number of days of the month
  184. $results [$i] = $mday [1]; Back to 1st
  185. $fisrtdaylunar = 1;
  186. $op = 2;
  187. $curmonthnum = ($everymonth [$LCJ][0]! = 0)? 13:12; A few months ago.
  188. if ($lci + 1 > $curmonthnum) {//13th/14 months, go to next year
  189. $lci = 1;
  190. $LCJ = $LCJ + 1;
  191. For a year, and to write the new zodiac
  192. $results [' year ']. = '/'. $mten [$everymonth [$LCJ][14]]. $mtwelve [$everymonth [$LCJ][15]];
  193. }
  194. else {//still in this year
  195. $lci = $lci + 1;
  196. $LCJ = $LCJ;
  197. }
  198. }
  199. if ($results [$i] = = $mday [1]) {//each month should show what month it is
  200. if ($everymonth [$LCJ][0]! = 0) {//year with leap month
  201. $MONTHSS = ($lci > $everymonth [$lcj][0])? ($lci-1): $LCI; Number of months after the leap month-1
  202. if ($lci = = $everymonth [$LCJ][0] + 1) {//This month happens to be leap months
  203. $monthssshow = $mmonth [0]. $mmonth [$MONTHSS]; Add a leap word in front
  204. $runyue = 1;
  205. }
  206. else {
  207. $monthssshow = $mmonth [$MONTHSS];
  208. }
  209. }
  210. else {
  211. $MONTHSS = $lci;
  212. $monthssshow = $mmonth [$MONTHSS];
  213. }
  214. if ($MONTHSS <= && $runyue! = 1) {//only 1 words of month plus ' month ' word
  215. $monthssshow. = $mmonth [13];
  216. }
  217. $results [$i] = $monthssshow;
  218. }
  219. }
  220. return $results;
  221. }
  222. Forgot to add this: Chinese lunar word
  223. $lnlunarcalendar = Array (
  224. ' Tiangan ' = = Array ("Unknown", "a", "B", "C", "Ding", "E", "Self", "Geng", "Xin", "Ren", "decyl"),
  225. ' Dizhi ' = = Array ("Unknown", "Child of the Year (rat)", "Ugly Year (ox)", "Yin Year (Tiger)", "Mao Year (Rabbit)", "Chen Year (Dragon)",
  226. "Years (Snakes)", "Noon (horse)", "Not Years (sheep)", "Dynasty (monkey)", "Unitary year (chicken)", "Xu Year (dog)", "Hai Year (pig)"),
  227. ' Month ' = = Array ("Leap", "positive", "two", "three", "four", "Five", "VI",
  228. "Seven", "eight", "Nine", "Ten", "11", "12", "month"),
  229. ' Day ' = = Array ("Unknown", "The Day", "second day", "Third Day", "four", "Duanwu", "Arrest", "When初七because", "Holidays", "Penggushan", "decade",
  230. "11", "12", "13", "14", "XV", "16", "17", "18", "19", "20",
  231. "21", "22", "23", "24", "25", "26", "27", "28", "29", "30")
  232. );
Copy Code
  • 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.