ホームページ  >  記事  >  バックエンド開発  >  幅広く奥深い太陰暦アルゴリズム

幅広く奥深い太陰暦アルゴリズム

WBOY
WBOYオリジナル
2016-07-25 09:07:591050ブラウズ
/** * 太陰暦 幅広く奥深い太陰暦 *オリジナルのデータとアルゴリズムのアイデアは S&S から提供されています Lab http://www.focus-2000.com 残念ながらウェブサイトは閉鎖されたようです */ /* 旧暦の各月の日数。 各要素は 1 年です。各要素のデータは次のとおりです。 [0] は閏月が存在する月です。0 は閏月がないことを意味します。 [1] ~ [13] は、1 年の 12 か月または 13 か月の各月の日数です。 [14] はその年の天茎の順序です。 [15] はその年の地上の枝の順序です */
  1. function lunarcalendar ($month, $year)
  2. {
  3. global $lnlunarcalendar;
  4. /**
  5. * 太陰暦
  6. * 元のデータとアルゴリズムのアイデアは S&S
  7. Lab から来ています http://www.focus-2000.com 残念ながらウェブサイトは閉鎖されているようです
  8. */
  9. /*
  10. 太陰暦の各月の日数カレンダー。
  11. 各要素は年です。各要素のデータは次のとおりです。
  12. [0] は閏月がある月、0 は閏月がないことを意味します
  13. [1] ~ [13] は 12 か月または 13 か月の月ごとの日数です。各年;
  14. [14] は現在の年 天の幹の順序、
  15. [15] はその年の地上の枝の順序
  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 => 配列(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 => 配列(5, 29, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 10, 4) ,
  22. 4 => 配列(0, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 0, 1, 5),
  23. 5 => 配列(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 => 配列(0、30、29、29、30、30、29、30、29、30、30、29、30、0、5、9)、
  27. 9 => 配列(2, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 30, 6, 10)、
  28. 10 => 配列(0, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 0, 7, 11),
  29. 11 => array(6, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 8, 12) ,
  30. 12 => array(0, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 0, 9, 1),
  31. 13 => 配列(0, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 0, 10, 2),
  32. 14 => 配列(5, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 29, 30, 1, 3),
  33. 15 => 配列(0, 30, 29) , 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 0, 2, 4),
  34. 16 => array(0, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 3, 5) ,
  35. 17 => array(2, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 4, 6),
  36. 18 => 配列(0, 30, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 0, 5, 7),
  37. 19 = > 配列(7, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 30, 6, 8),
  38. 20 => 配列(0, 29, 30, 29) , 29, 30, 29, 29, 30, 30, 29, 30, 30, 0, 7, 9),
  39. 21 => array(0, 30, 29, 30, 29, 29, 30, 29, 29 , 30, 29, 30, 30, 0, 8, 10) ,
  40. 22 => array(5, 30, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30 、9、11)、
  41. 23 => 配列(0、29、30、30、29、30、29、30、29、29、30、29、30、0、10、12)、
  42. 24 => ; 配列(0, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 29, 0, 1, 1),
  43. 25 => 配列(4, 30, 29, 30) , 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 2, 2),
  44. 26 => array(0, 29, 29, 30, 29, 30, 29, 30, 30 , 29, 30, 30, 29, 0, 3, 3) ,
  45. 27 => array(0, 30, 29, 29, 30, 29, 30, 29, 30, 29, 30, 30, 30, 0 、4, 4)、
  46. 28 => 配列(2, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 30, 5, 5)、
  47. 29 => ; 配列(0, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 0, 6, 6),
  48. 30 => 配列(6, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 7, 7),
  49. 31 => 配列(0, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0, 8, 8) ,
  50. 32 => 配列(0, 30, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0, 9, 9)、
  51. 33 => 配列(5、29、30、30、29、30、30、29、30、29、30、29、29、30、10、10)、
  52. 34 => array(0, 29, 30, 29, 30, 30, 29, 30, 29, 30, 30, 29, 30, 0, 1, 11),
  53. 35 => array(0, 29, 29, 30, 29) , 30, 29, 30, 30, 29, 30, 30, 29, 0, 2, 12),
  54. 36 => array(3, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 30, 29, 3, 1) ,
  55. 37 => 配列(0, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 0, 4, 2)、
  56. 38 => 配列(7、30、30、29、29、30、29、29、30、29、30、30、29、30、5、3)、
  57. 39 => 配列( 0, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0, 6, 4),
  58. 40 => 配列(0, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0, 7, 5),
  59. 41 => array(6, 30, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 8, 6) ,
  60. 42 => 配列(0, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 0, 9, 7)、
  61. 43 => 配列(0、29、30、29、30、29、30、30、29、30、29、30、29、0、10、8)、
  62. 44 => 配列( 4, 30, 29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 1, 9),
  63. 45 => array(0, 29, 29, 30, 29, 29 , 30, 29, 30, 30, 30, 29, 30, 0, 2, 10),
  64. 46 => array(0, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 0, 3, 11) ,
  65. 47 => 配列(2, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 4, 12) ,
  66. 48 => 配列(0, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0, 5, 1),
  67. 49 => 配列(7, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 6, 2),
  68. 50 => array(0, 29, 30, 30, 29, 30, 30 , 29, 29, 30, 29, 30, 29, 0, 7, 3),
  69. 51 => 配列(0, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29) , 30, 0, 8, 4) ,
  70. 52 => 配列(5, 29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 9, 5),
  71. 53 => 配列(0, 29, 30, 29, 29, 30, 30, 29, 30, 30, 29, 30, 29, 0, 10, 6)、
  72. 54 => 配列(0, 30) 、29、30、29、29、30、29、30、30、29、30、30、0、1、7)、
  73. 55 =>配列(3, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 2, 8),
  74. 56 =>配列(0, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 0, 3, 9),
  75. 57 =>配列(8, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29, 4, 10),
  76. 58 =>配列(0, 30, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0, 5, 11),
  77. 59 =>配列(0, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 0, 6, 12),
  78. 60 => array(6, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 7, 1),
  79. 61 =>配列(0, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 0, 8, 2),
  80. 62 =>配列(0, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0, 9, 3),
  81. 63 => array(4, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 10, 4),
  82. 64 =>配列(0, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 0, 1, 5),
  83. 65 =>配列(0, 29, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 0, 2, 6),
  84. 66 => array(3, 30, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 3, 7),
  85. 67 =>配列(0, 30, 30, 29, 30, 30, 29, 29, 30, 29, 30, 29, 30, 0, 4, 8),
  86. 68 =>配列(7, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 5, 9),
  87. 69 =>配列(0, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 6, 10),
  88. 70 =>配列(0, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 0, 7, 11),
  89. 71 => array(5, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 30, 8, 12),
  90. 72 =>配列(0, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 0, 9, 1),
  91. 73 =>配列(0, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 0, 10, 2),
  92. 74 => array(4, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 1, 3),
  93. 75 =>配列(0, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 0, 2, 4),
  94. 76 =>配列(8, 30, 30, 29, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 3, 5),
  95. 77 =>配列(0, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 29, 0, 4, 6),
  96. 78 =>配列(0, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 5, 7),
  97. 79 => array(6, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 6, 8),
  98. 80 =>配列(0, 30, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 0, 7, 9),
  99. 81 =>配列(0, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 0, 8, 10),
  100. 82 => array(4, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 9, 11),
  101. 83 =>配列(0, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 0, 10, 12),
  102. 84 =>配列(10, 30, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 1, 1),
  103. 85 =>配列(0, 29, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0, 2, 2),
  104. 86 =>配列(0, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 29, 0, 3, 3),
  105. 87 =>配列(6, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 29, 4, 4),
  106. 88 =>配列(0, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0, 5, 5),
  107. 89 => array(0, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 30, 0, 6, 6),
  108. 90 => array(5, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 30, 7, 7),
  109. 91 =>配列(0, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 0, 8, 8),
  110. 92 =>配列(0, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 0, 9, 9),
  111. 93 => array(3, 29, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 10, 10),
  112. 94 =>配列(0, 30, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0, 1, 11),
  113. 95 =>配列(8, 29, 30, 30, 29, 30, 29, 30, 30, 29, 29, 30, 29, 30, 2, 12),
  114. 96 =>配列(0, 29, 30, 29, 30, 30, 29, 30, 29, 30, 30, 29, 29, 0, 3, 1),
  115. 97 =>配列(0, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0, 4, 2),
  116. 98 =>配列(5, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 29, 30, 5, 3),
  117. 99 =>配列(0, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 0, 6, 4),
  118. 100 =>配列(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 =>配列(0, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0, 9, 7),
  121. 103 =>配列(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. 105 =>配列(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 =>配列(0, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 30, 0, 4, 12),
  126. 108 =>配列(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. 110 =>配列(0, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0, 7, 3),
  129. 111 =>配列(0, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0, 8, 4)、
  130. 112 => 配列(4, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 9, 5),
  131. 113 => 配列(0, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 0, 10, 6),
  132. 114 => array(9, 29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 1, 7),
  133. 115 => array(0, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 30, 29, 0, 2, 8)、
  134. 116 => 配列(0, 30, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 0, 3, 9)、
  135. 117 => 配列(6, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 4, 10),
  136. 118 => 配列(0, 29, 30) , 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 0, 5, 11),
  137. 119 => 配列(0, 30, 29, 30, 29, 30, 29, 29) 、30、29、29、30、30、0、6、12)、
  138. 120 => 配列(4、29、30、30、30、29、30、29、29、30、29、30、29) , 30, 7, 1)
  139. );
  140. $mten = $lnlunarcalendar['tiangan'];// 月の天の幹
  141. $mtwelve = $lnlunarcalendar['dizhi'];// 月の地上の枝
  142. $mmonth = $ lnlunarcalendar ['month'];// 太陰月
  143. $mday = $lnlunarcalendar['day'];// 太陰日
  144. // 1900 年 12 月 21 日までのグレゴリオ暦の合計日数
  145. $total = 69 * 365 + 17 + 11 ;
  146. //1970 年 1 月 1 日より前のことはカウントされません
  147. if ($year == "" || $month == "" || ($year < 1970 or $year > 2020)) return ' '; //この範囲を超える計算はありません
  148. // 1900 年 12 月 21 日から、要求された日付までのグレゴリオ暦の合計日数を計算します
  149. for ($y = 1970; $y $total += 365;
  150. if ($y % 4 == 0) $total ++;
  151. }
  152. // 今年の月を加算します
  153. $ total += gmdate(" z", gmmktime(0, 0, 0, $month, 1, $year));
  154. // 旧暦の累積日数を使用して、旧暦の日数を超えているかどうかを判断します太陽暦
  155. $flag1 = 0; //ループから抜け出す条件を判定
  156. $lcj = 0;
  157. while ($lcj $lci = 1;
  158. while ($lci $mtotal += $everymonth[$lcj][$lci];
  159. if ($mtotal >= $total) {
  160. $flag1 = 1;
  161. Break;
  162. }
  163. $lci++;
  164. }
  165. if ($flag1 == 1) Break;
  166. $lcj++;
  167. }
  168. // 上記から、取得された $lci は現在の太陰月、$lcj は現在の太陰年です
  169. // 1 日の太陰日付を計算しますリクエストされた月
  170. $fisrtdaylunar = $everymonth[$lcj][$lci] - ($mtotal - $total) ;
  171. $results['year'] = $mten[$everymonth[$lcj][14]] $ mtwelve[$everymonth[$lcj][15]]; //今は何年ですか? $daysthismonth = gmdate( "t", gmmktime(0, 0, 0, $month, 1, $year)) / /今月の日数
  172. $op = 1;
  173. for ($i = 1; $i $possiblelunarday = $fisrtdaylunar + $op-1; //理論的には重ね合わせた太陰日
  174. if ($possiblelunarday <= $everymonth[$lcj][$lci]) { // これは月内の日数の範囲内
  175. $results[$i] = $mday[$possiblelunarday];
  176. $op += 1;
  177. }
  178. else { // 今月の日の範囲内ではありません
  179. $results[$i] = $ mday[1] // 1 日目に戻ります
  180. $fisrtdaylunar = 1;
  181. ; $op = 2;
  182. $curmonthnum = ($everymonth[$lcj][0] != 0) ? 13 : 12; //今年は月があります
  183. if ($lci + 1 > $curmonthnum) { // 13/14番目の月です、次の年へ
  184. $lci = 1;
  185. $lcj = $lcj + 1;
  186. // 変更 年末なので新年の干支をメモしておきます
  187. $ results['year'] .= '/' . $mten[$everymonth[$lcj][14]] . $mtwelve[$everymonth[$lcj] [15]];
  188. }
  189. else { // このままですyear
  190. $lci = $lci + 1;
  191. $lcj = $lcj;
  192. }
  193. }
  194. if ($results[$i] == $mday [1]) { // 各月の最初の日に表示される内容month その月は
  195. if ($everymonth[$lcj][0] != 0) { // 閏月のある年
  196. $monthss = ($lci > $everymonth[$lcj][0]) ($lci) -1) : $lci; // 閏月後の月数 - 1
  197. if ($lci == $everymonth[$lcj][0] + 1) { // 今月はたまたま閏月です
  198. $monthssshow = $mmonth[$months]; //閏月を前に追加します
  199. $runyue = 1;
  200. }
  201. else {
  202. $monthssshow = $mmonth[$ monthss];
  203. }
  204. }
  205. else {
  206. $monthss = $lci;
  207. $monthssshow = $mmonth[$monthss];
  208. }
  209. if ($monthss $monthssshow .= $mmonth[13];
  210. }
  211. $results[$i] = $monthssshow;
  212. }
  213. }
  214. return $results;
  215. }
  216. // これを追加するのを忘れていました: 旧暦の文字
  217. $lnlunarcalendar = array(
  218. 'tiangan' => array("Unknown", "A", "B", "C", "D", "五" , "Ji", "Geng", "Xin", "ren", "縸"),
  219. 'dizhi' => array("Unknown", "Zi Nian (ネズミ)", "Chou Nian (牛)" , 「イン・ニアン(虎)」、「マオ・ニアン(ウサギ)」、「チェン・ニアン(龍)」、
  220. 「シ・ニアン(蛇)」、「ウー・ニアン(馬)」、「ウェイ・ニアン(羊)」、シェンニアン(申)、「ヨウニアン(酉)」、「シューニアン(犬)」、「ハイニアン(豚)」),
  221. '月' => array("闰", "正", "二」、「三」、「四」、「五」、「六」、
  222. 「七」、「八」、「九」、「十」、「十一」、「十二」、「月」)、
  223. 'day' => array("不明", "中学校 1 日目", "中学校 2 日目", "中学校 3 日目", "中学校 4 日目", "中学校 5 日目" 「中学の日」、「中学6日」、「中学7日」、「8日」、「9日」、「10日」、
  224. 「11日」、「12日」、「13日」 "、"14番目"、"15番目"、"16番目"、"17番目"、" 18"、"19"、"20"、
  225. "21"、"22"、"23"、"二十四", "二五", "二六", "二七", "忿八", "忿九", "十三")
  226. );
コードをコピー


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。