ホームページ > バックエンド開発 > PHPチュートリアル > PHP 旧暦グレゴリオ暦変換

PHP 旧暦グレゴリオ暦変換

WBOY
リリース: 2016-07-25 09:09:45
オリジナル
2474 人が閲覧しました
PHP 旧暦グレゴリオ暦変換
  1. /*
  2. 雲南省曲清師範大学コンピューターサイエンス工学部、Yang Haixi 著
  3. 2009-9-3
  4. */
  5. class Lunar
  6. {
  7. private $_SMDay = array (1 => 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);//グレゴリオ暦の月の日数を定義します
  8. private $_LStart = 1950;/ /旧暦は 1950 年から始まります
  9. private $_LMDay = array(
  10. //差: 旧暦の最初の月の 1 日からグレゴリオ暦の 1 月 1 日までの日数、1 ~ 12: の数太陰月の日数; 閏: 閏月がある場合、その月の通常の日数を記録します
  11. // 差 1 2 3 4 5 6 7 8 9 10 11 12 閏
  12. array(47,29,30, 30,29,30,30,29,29,30,29,30,29),
  13. 配列(36,30, 29,30,30,29,30,29,30,29,30,29,30) ,
  14. array(6,29,30,29,30,59,29,30,30,29,30,29, 30,29), //5月29日閏5月30日
  15. array(44,29,30,29) ,29,30,30,29,30,30,29,30,29),
  16. 配列(33,30 ,29,30,29,29,30,29,30,30,29,30,30),
  17. array(23,29,30,59,29,29,30,29,30,29,30,30 ,30,29), //3 月 29 日 閏 3 月 30日
  18. array(42,29,30,29, 30,29,29,30,29,30,29,30,30),
  19. 配列(30, 30,29,30,29,30,29,29,59,30,29,30,29,30) , //8月30日 閏8月29日
  20. array(48,30,30,30,29,30 ,29,29,30,29,30,29,30),
  21. array(38,29,30,30,29 ,30,29,30,29,30,29,30,29),
  22. 配列(27 ,30,29,30,29,30,59,30,29,30,29,30,29,30), //6月30日 閏6月29日
  23. array(45,30,29,30,29, 30,29,30,30,29,30,29,30),
  24. array(35,29,30,29,29, 30,29,30,30,29,30,30,29),
  25. 配列( 24,30,29,30,58,30,29,30,29,30,30,30,29,29), / /4月29日 閏4月29日
  26. array(43,30,29,30,29 ,29,30,29,30,29,30,30,30),
  27. array(32,29,30,29,30,29 ,29,30,29,29,30,30,29),
  28. 配列 (20,30,30,59,30,29,29,30,29,29,30,30,29,30), // 3月30日 閏3月29日
  29. array(39,30,30,29, 30,30,29,29,30,29,30,29,30),
  30. array(29,29,30,29,30,30, 29,59,30,29,30,29,30,30) , //7月30日 閏7月29日
  31. array(47,29,30,29,30,29,30,30,29,30,29,30 ,29)、
  32. 配列(36,30,29,29 ,30,29,30,30,29,30,30,29,30),
  33. 配列(26,29,30,29,29,59,30 ,29,30,30,30,29,30,30 ), //5月30日閏5月29日
  34. array(45,29,30,29,29,30,29,30,29,30,30,29, 30)、
  35. 配列(33,30,29, 30,29,29,30,29,29,30,30,29,30),
  36. 配列(22,30,30,29,59,29,30, 29,29,30,30,29,30, 30), //4月30日 閏4月29日
  37. array(41,30,30,29,30,29,29,30,29,29,30,29,30 ),
  38. array(30,30,30 ,29,30,29,30,29,59,29,30,29,30,30), //8 月 30 日 閏 8 月 29 日
  39. array(48,30,29, 30,30,29,30, 29,30,29,30,29,29),
  40. 配列(37,30,29,30,30,29,30,30,29,30,29,30,29) ,
  41. array(27,30, 29,29,30,29,60,29,30,30,29,30,29,30), //6 月 30 日 閏 6 月 30日
  42. array(46,30,29,29) ,30,29,30 ,29,30,30,29,30,30),
  43. 配列(35,29,30,29,29,30,29,29,30,30,29,30,30),
  44. array(24,30 ,29,30,58,30,29,29,30,29,30,30,30,29), //4 月 29 日 閏 4 月 29 日
  45. array(43,30,29,30, 29,29, 30,29,29,30,29,30,30),
  46. 配列(32,30,29,30,30,29,29,30,29,29,59,30,30,30) , //10 月 30 閏 10 月 29 日
  47. array(50,29,30,30,29,30,29,30,29,29,30,29,30),
  48. array(39,29,30,30, 29,30 ,30,29,30,29,30,29,29),
  49. 配列(28,30,29,30,29,30,59,30,30,29,30,29,29,30) , // 6月30日 閏6月29日
  50. array(47,30,29,30,29,30,29,30,30,29,30,30,29),
  51. array(36,30,29,29,30 、29,30,29,30,29,30,30,30),
  52. 配列(26,29,30,29,29,59,29,30,29,30,30,30,30,30), / /5月30日 閏5月29日
  53. array(45,29,30,29,29,30,29,29,30,29,30,30,30),
  54. array(34,29,30,30,29 , 29,30,29,29,30,29,30,30),
  55. 配列(22,29,30,59,30,29,30,29,29,30,29,30,29,30), / /3月30日 閏3月29日
  56. array(40,30,30,30,29,30,29,30,29,29,30,29,30),
  57. array(30,29,30,30, 29,30 ,29,30,59,29,30,29,30,30), //8月30日閏8月29日
  58. array(49,29,30,29,30,30,29,30,29 ,30,30, 29,29)、
  59. 配列(37,30,29,30,29,30,29,30,30,29,30,30,29),
  60. 配列(27,30,29,29,30,58, 30,30,29,30,30,29,30,29), //5月29日 閏5月29日
  61. array(46,30,29,29,30,29,29,30, 29,30,30,30 ,29)、
  62. 配列(35,30,30,29,29,30,29,29,30,29,30,30,29),
  63. 配列(23,30,30,29,59,30,29 ,29,30,29,30,29,30,30), //4月30日 閏4月29日
  64. array(42,30,30,29,30,29,30,29 ,29,30,29,30, 29)、
  65. 配列(31,30,30,29,30,30,29,30,29,29,30,29,30),
  66. 配列(21,29,59 ,30,30,29,30, 29,30,29,30,29,30,30), //2月30日 閏2月29日
  67. array(39,29,30,29,30,29,30, 30,29,30,29,30,29 ),
  68. array(28,30,29,30,29,30,29,59,30,30,29,30,30,30), //7月30日閏7月29日
  69. array(48,29,29, 30,29,29,30,29,30,30,30,29,30),
  70. 配列(37,30,29,29,30,29,29 ,30,29,30,30,29,30) ,
  71. array(25,30,30,29,29,59,29,30,29,30,29,30,30,30), //5月30日閏5月29日
  72. array(44,30,29,30) ,29,30,29,29,30,29,30,29,30),
  73. 配列(33,30,29,30,30,29, 30,29,29,30,29,30,29),
  74. array(22,30,29,30,59,30,29,30,29,30,29,30,29,30), //4月30閏4月29日
  75. array(40,30,29,30) ,29,30,30,29,30,29,30,29,30),
  76. 配列(30,29,30,29,30,29 ,30,29,30,59,30,29,30,30 ), //9月30日閏9月29日
  77. 配列(49,29,30,29,29,30,29,30,30,30,29,30,29),
  78. 配列(38,30,29,30,29,29,30,29,30, 30,29,30,30),
  79. array(27,29,30,29,30,29,59,29,30,29,30,30,30,29), //6 月 29 日 閏 6 月 30 日
  80. 配列(46,29,30,29,30,29,29,30,29,30,29,30,30),
  81. 配列(35,30,29,30,29,30,29,29,30 ,29 ,29,30,30),
  82. array(24,29,30,30,59,30,29,29,30,29,30,29,30,30), //4月30日閏4月29日
  83. array( 42,29,30,30,29,30,29,30,29,30,29,30,29),
  84. 配列(31,30,29,30,29,30,30,29, 30,29, 30,29,30),
  85. array(21,29,59,29,30,30,29,30,30,29,30,29,30,30), //2月30日閏日月29
  86. array( 40,29,30,29,29,30,29,30,30,29,30,30,29),
  87. 配列(28,30,29,30,29,29,59,30 ,29,30, 30,30,29,30), //6月30日 閏6月29日
  88. array(47,30,29,30,29,29,30,29,29,30,30,30, 29),
  89. array(36) ,30,30,29,30,29,29,30,29,29,30,30,29),
  90. 配列(25,30,30,30,29,59,29, 30,29,29,30 ,30,29,30), //5月30日閏5月29日
  91. array(43,30,30,29,30,29,30,29,30,29,29,30 ,30),
  92. array(33, 29,30,29,30,30,29,30,29,30,29,30,29),
  93. 配列(22,29,30,59,30,29,30 ,30,29,30,29, 30,29,30), //3月30日 閏3月29日
  94. array(41,30,29,29,30,29,30,30,29,30,30, 29,30),
  95. array(30,29) ,30,29,29,30,29,30,29,30,30,59,30,30), //11月30日閏11月29日
  96. 配列(49,29,30,29,29,30,29, 30,29,30,30,29,30),
  97. 配列(38,30,29,30,29,29,30,29,29,30 ,30,29,30),
  98. 配列(27,30, 30,29,30,29,59,29,29,30,29,30,30,29), //6月29日閏6月30日
  99. array(45,30,30,29,30,29,29,30 ,29,29,30,29,30),
  100. 配列(34,30,30,29,30,29,30,29,30, 29,29,30,29),
  101. 配列(23,30,30 ,29,30,59,30,29,30,29,30,29,29,30), //5月30日 閏5月29日
  102. array(42,30,29,30,30,29,30,29, 30,30,29,30,29)、
  103. 配列(31,29,30,29,30,29,30,30,29 ,30,30,29,30),
  104. 配列(21,29,59, 29,30,29,30,29,30,30,29,30,30,30), //2月30日閏2月29日
  105. array(40,29,30,29,29,30,29,29,30 ,30,29,30,30),
  106. array(29,30,29,30,29,29,30,58, 30,29,30,30,30,29), //7月29日閏7月29日
  107. 配列(47,30,29,30,29,29,30,29,29,30,29,30,30 ),
  108. 配列(36,30,29,30,29,30,29,30,29, 29,30,29,30),
  109. array(25,30,29,30,30,59,29,30 ,29,29,30,29,30,29), //5月29日閏5月30日
  110. 配列(44,29,30,30,29,30,30,29,30,29,29,30,29),
  111. 配列(32,30,29,30,29,30,30,29,30,30 ,29,30,29),
  112. array(22,29,30,59,29,30,29, 30,30,29,30,30,29,29), //3 月 29 日 閏 3 月 30 日
  113. );
  114. //閏年かどうか
  115. private function IsLeap Year($A Year){
  116. return ($Ayear % 4 == 0) && (($Ayear % 100 != 0) || ($Ayear % 400 == 0) ));
  117. }
  118. //グレゴリオ暦の月の日数 (年: 年; 月: 月)
  119. プライベート関数 GetSMon( $year,$month)
  120. {
  121. if($this->IsLeap Year ($year) && $month == 2)
  122. return 29;
  123. else
  124. return $this->_SMDay[$month];
  125. }
  126. //旧暦名変換
  127. private function LyearName($year)
  128. {
  129. $Name = array("ゼロ"、"一"、"二"、"三"、"四"、"五"、"六"、"七"、"八"、"九");
  130. for($ i=0;$i for($k=0;$k if($year[ $i]==$k)
  131. $tmp.=$Name[ $k];
  132. return $tmp;
  133. }
  134. プライベート関数 LMonName($month)
  135. {
  136. if($month >=1 && $month <=12 )
  137. {
  138. $Name = array( 1=> ;"正"、"二"、"三"、"四"、"五"、"六"、"七"、"八"、"九"、"十"、"十一"、"十二");
  139. return $Name[$month];
  140. }
  141. return $month;
  142. }
  143. プライベート関数 LDayName($day)
  144. {
  145. if( $day >=1 && $day <=30 )
  146. {
  147. $ Name = array( 1 =>
  148. "中学1日目"、"中学2日目"、"中学3日目"、"中学4日目"、"中学5日目"高校" "、"旧月 6 日"、"旧月 7 日"、"旧月 8 日"、"旧月 9 日"、"旧月 10 日"旧暦の月"、
  149. "十一"、"十二"、"十三"、"十四"、"十"、"五"、"十六"、"十七"、"十八"、"十九"、"二十"、
  150. " 21」、「22」、「23」、「24」、「」、「25」、「26」、「27」、「28」、「20」 -nine", "Thirty"
  151. );
  152. return $Name[$day];
  153. }
  154. return $day;
  155. }
  156. //グレゴリオ暦を旧暦に変換します (Sdate: グレゴリオ暦の日付)
  157. public function S2L($date)
  158. {
  159. list($year, $month, $day) =explode("-", $date);
  160. if($ year <= 1951 || $month <= 0 || $day <= 0 || $year >= 2051 ) return false;
  161. //クエリ日からの日数を取得します。今年の 1 月 1 日
  162. $date1 = strtotime($year."-01-01");//今年の 1 月 1 日
  163. $date2 = strtotime($year."-".$month."-" .$day);
  164. $days=round (($date2-$date1)/3600/24);
  165. $days += 1;
  166. // 対応する年間太陰暦データを取得し、配列 Larray に変換します
  167. $ Larray = $this->_LMDay[$year - $this- >_LStart];
  168. if($days <= $Larray[0])
  169. {
  170. $Lyear = $year - 1;
  171. $days = $ Larray[0] - $days;
  172. $Larray = $this- >_LMDay[$Lyear - $this->_LStart];
  173. if($days < $Larray[12])
  174. {
  175. $Lmonth = 12 ;
  176. $Lday = $Larray[12] - $days;
  177. }
  178. else
  179. {
  180. $Lmonth = 11;
  181. $days = $days - $Larray[12];
  182. $Lday = $Larray[11] - $ days;
  183. }
  184. }
  185. else
  186. {
  187. $Lyear = $ year;
  188. $days = $days - $Larray[0];
  189. for($i = 1;$i <= 12;$i++)
  190. {
  191. if($days > $Larray[$i]) $ days = $days - $Larray[$i];
  192. else
  193. {
  194. if ($days > 30){
  195. $days = $days - $Larray [13];
  196. $Ltype = 1;
  197. }
  198. $ Lmonth = $i;
  199. $Lday = $days;
  200. Break;
  201. }
  202. }
  203. }
  204. return mktime(0, 0, 0, $Lmonth, $ Lday, $Lyear);
  205. //$Ldate = $Lyear. "-".$Lmonth."-".$Lday;
  206. //$Ldate = $this->LyearName($Lyear)." Year". $this->LMonName($Lmonth)."Month". $this->LDayName($Lday);
  207. //if($Ltype) $Ldate.="(Leap)";
  208. //return $Ldate ;
  209. }
  210. //旧暦をグレゴリオ暦に変換します (日付: 旧暦; タイプ: 閏月かどうか)
  211. public function L2S($date,$type = 0)
  212. {
  213. list($year, $month , $day) = split("-",$date);
  214. if($year < = 1951 || $month <= 0 || $day <= 0 || $year >= 2051 ) return false;
  215. $Larray = $this->_LMDay[$year - $this->_LStart ];
  216. if($type == 1 && count($Larray)<=12 ) return false;//リクエスト閏月をクエリしますが、閏月が見つかりません
  217. //クエリ対象の太陰暦が閏月で、その年の太陰暦配列に閏月が含まれる場合 データを取得します
  218. if($Larray[$month]>30 && $type == 1 && count($Larray) >=13) $day = $Larray[13] + $day;
  219. //年を取得 旧暦の日付からグレゴリオ暦の 1 月 1 日までの日数
  220. $days = $day;
  221. for($i=0;$i $days += $Larray[$i];
  222. //旧暦の日付をクエリする場合は、グレゴリオ暦の 1 月 1 日からの 1 年
  223. if($days > 366 || ($this->GetSMon($month,2)!=29 && $days>365 ))
  224. {
  225. $Syear = $year +1;
  226. if($this->GetSMon($month,2)!=29)
  227. $days-=366;
  228. else
  229. $days-=365;
  230. if($days > $this-> _SMDay[1])
  231. {
  232. $Smonth = 2;
  233. $Sday = $days - $this->_SMDay[1];
  234. }
  235. else
  236. {
  237. $Smonth = 1;
  238. $Sday = $days;
  239. }
  240. }
  241. else
  242. {
  243. $Syear =$year;
  244. for($i=1;$i<=12;$i++)
  245. {
  246. if($days > $this- >GetSMon($Syear, $i))
  247. $days-=$this->GetSMon($Syear,$i);
  248. else
  249. {
  250. $Smonth = $i;
  251. $Sday = $days;
  252. ブレーク ;
  253. }
  254. }
  255. }
  256. return mktime(0, 0, 0, $Smonth, $Sday, $Syear);
  257. //$Sdate = $Syear."-".$Smonth."-".$Sday
  258. //return $Sdate;
  259. }
  260. }
  261. ?>
コードをコピー
  1. require_once 'Lunar.php';
  2. $today = date("Y-m-d");
  3. $lunar = new Lunar();
  4. //グレゴリオ暦から太陰暦へ
  5. $nl = date( "Y-m-d" ",$lunar->S2L($today));
  6. //太陰暦をグレゴリオ暦に変換します
  7. $gl = date("Y-m-d",$lunar->L2S($nl));
  8. echo "今日のグレゴリオ暦は: $ today
    ";
  9. echo "太陰暦への変換は: $nl
    ";
  10. echo "グレゴリオ暦への変換は: $gl
    ";
  11. ?>
コードをコピー


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート