/** * 太陰暦 幅広く奥深い太陰暦
*オリジナルのデータとアルゴリズムのアイデアは S&S から提供されています
Lab http://www.focus-2000.com 残念ながらウェブサイトは閉鎖されたようです
*/
/*
旧暦の各月の日数。
各要素は 1 年です。各要素のデータは次のとおりです。
[0] は閏月が存在する月です。0 は閏月がないことを意味します。
[1] ~ [13] は、1 年の 12 か月または 13 か月の各月の日数です。
[14] はその年の天茎の順序です。
[15] はその年の地上の枝の順序です
*/
- function lunarcalendar ($month, $year)
- {
- global $lnlunarcalendar;
- /**
- * 太陰暦
- * 元のデータとアルゴリズムのアイデアは S&S
- Lab から来ています http://www.focus-2000.com 残念ながらウェブサイトは閉鎖されているようです
- */
- /*
- 太陰暦の各月の日数カレンダー。
- 各要素は年です。各要素のデータは次のとおりです。
- [0] は閏月がある月、0 は閏月がないことを意味します
- [1] ~ [13] は 12 か月または 13 か月の月ごとの日数です。各年;
- [14] は現在の年 天の幹の順序、
- [15] はその年の地上の枝の順序
- */
- $everymonth = array(
- 0 => array(8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 30, 7, 1),
- 1 => 配列(0, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 0, 8, 2) ,
- 2 => array(0, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 0, 9, 3),
- 3 => 配列(5, 29, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 10, 4) ,
- 4 => 配列(0, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 0, 1, 5),
- 5 => 配列(0, 30, 30, 29, 30, 30, 29, 29, 30, 29, 30, 29, 30, 0, 2, 6),
- 6 => array(4, 29, 30, 30, 29, 30, 29 , 30, 29, 30, 29, 30, 29, 30, 3, 7) ,
- 7 => array(0, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30 、29、0、4、8)、
- 8 => 配列(0、30、29、29、30、30、29、30、29、30、30、29、30、0、5、9)、
- 9 => 配列(2, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 30, 6, 10)、
- 10 => 配列(0, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 0, 7, 11),
- 11 => array(6, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 8, 12) ,
- 12 => array(0, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 0, 9, 1),
- 13 => 配列(0, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 0, 10, 2),
- 14 => 配列(5, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 29, 30, 1, 3),
- 15 => 配列(0, 30, 29) , 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 0, 2, 4),
- 16 => array(0, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 3, 5) ,
- 17 => array(2, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 4, 6),
- 18 => 配列(0, 30, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 0, 5, 7),
- 19 = > 配列(7, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 30, 6, 8),
- 20 => 配列(0, 29, 30, 29) , 29, 30, 29, 29, 30, 30, 29, 30, 30, 0, 7, 9),
- 21 => array(0, 30, 29, 30, 29, 29, 30, 29, 29 , 30, 29, 30, 30, 0, 8, 10) ,
- 22 => array(5, 30, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30 、9、11)、
- 23 => 配列(0、29、30、30、29、30、29、30、29、29、30、29、30、0、10、12)、
- 24 => ; 配列(0, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 29, 0, 1, 1),
- 25 => 配列(4, 30, 29, 30) , 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 2, 2),
- 26 => array(0, 29, 29, 30, 29, 30, 29, 30, 30 , 29, 30, 30, 29, 0, 3, 3) ,
- 27 => array(0, 30, 29, 29, 30, 29, 30, 29, 30, 29, 30, 30, 30, 0 、4, 4)、
- 28 => 配列(2, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 30, 5, 5)、
- 29 => ; 配列(0, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 0, 6, 6),
- 30 => 配列(6, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 7, 7),
- 31 => 配列(0, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0, 8, 8) ,
- 32 => 配列(0, 30, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0, 9, 9)、
- 33 => 配列(5、29、30、30、29、30、30、29、30、29、30、29、29、30、10、10)、
- 34 => array(0, 29, 30, 29, 30, 30, 29, 30, 29, 30, 30, 29, 30, 0, 1, 11),
- 35 => array(0, 29, 29, 30, 29) , 30, 29, 30, 30, 29, 30, 30, 29, 0, 2, 12),
- 36 => array(3, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 30, 29, 3, 1) ,
- 37 => 配列(0, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 0, 4, 2)、
- 38 => 配列(7、30、30、29、29、30、29、29、30、29、30、30、29、30、5、3)、
- 39 => 配列( 0, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0, 6, 4),
- 40 => 配列(0, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0, 7, 5),
- 41 => array(6, 30, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 8, 6) ,
- 42 => 配列(0, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 0, 9, 7)、
- 43 => 配列(0、29、30、29、30、29、30、30、29、30、29、30、29、0、10、8)、
- 44 => 配列( 4, 30, 29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 1, 9),
- 45 => array(0, 29, 29, 30, 29, 29 , 30, 29, 30, 30, 30, 29, 30, 0, 2, 10),
- 46 => array(0, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 0, 3, 11) ,
- 47 => 配列(2, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 4, 12) ,
- 48 => 配列(0, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0, 5, 1),
- 49 => 配列(7, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 6, 2),
- 50 => array(0, 29, 30, 30, 29, 30, 30 , 29, 29, 30, 29, 30, 29, 0, 7, 3),
- 51 => 配列(0, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29) , 30, 0, 8, 4) ,
- 52 => 配列(5, 29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 9, 5),
- 53 => 配列(0, 29, 30, 29, 29, 30, 30, 29, 30, 30, 29, 30, 29, 0, 10, 6)、
- 54 => 配列(0, 30) 、29、30、29、29、30、29、30、30、29、30、30、0、1、7)、
- 55 =>配列(3, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 2, 8),
- 56 =>配列(0, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 0, 3, 9),
- 57 =>配列(8, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29, 4, 10),
- 58 =>配列(0, 30, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0, 5, 11),
- 59 =>配列(0, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 0, 6, 12),
- 60 => array(6, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 7, 1),
- 61 =>配列(0, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 0, 8, 2),
- 62 =>配列(0, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0, 9, 3),
- 63 => array(4, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 10, 4),
- 64 =>配列(0, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 0, 1, 5),
- 65 =>配列(0, 29, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 0, 2, 6),
- 66 => array(3, 30, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 3, 7),
- 67 =>配列(0, 30, 30, 29, 30, 30, 29, 29, 30, 29, 30, 29, 30, 0, 4, 8),
- 68 =>配列(7, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 5, 9),
- 69 =>配列(0, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 6, 10),
- 70 =>配列(0, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 0, 7, 11),
- 71 => array(5, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 30, 8, 12),
- 72 =>配列(0, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 0, 9, 1),
- 73 =>配列(0, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 0, 10, 2),
- 74 => array(4, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 1, 3),
- 75 =>配列(0, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 0, 2, 4),
- 76 =>配列(8, 30, 30, 29, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 3, 5),
- 77 =>配列(0, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 29, 0, 4, 6),
- 78 =>配列(0, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 5, 7),
- 79 => array(6, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 6, 8),
- 80 =>配列(0, 30, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 0, 7, 9),
- 81 =>配列(0, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 0, 8, 10),
- 82 => array(4, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 9, 11),
- 83 =>配列(0, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 0, 10, 12),
- 84 =>配列(10, 30, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 1, 1),
- 85 =>配列(0, 29, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0, 2, 2),
- 86 =>配列(0, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 29, 0, 3, 3),
- 87 =>配列(6, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 29, 4, 4),
- 88 =>配列(0, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0, 5, 5),
- 89 => array(0, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 30, 0, 6, 6),
- 90 => array(5, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 30, 7, 7),
- 91 =>配列(0, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 0, 8, 8),
- 92 =>配列(0, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 0, 9, 9),
- 93 => array(3, 29, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 10, 10),
- 94 =>配列(0, 30, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0, 1, 11),
- 95 =>配列(8, 29, 30, 30, 29, 30, 29, 30, 30, 29, 29, 30, 29, 30, 2, 12),
- 96 =>配列(0, 29, 30, 29, 30, 30, 29, 30, 29, 30, 30, 29, 29, 0, 3, 1),
- 97 =>配列(0, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0, 4, 2),
- 98 =>配列(5, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 29, 30, 5, 3),
- 99 =>配列(0, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 0, 6, 4),
- 100 =>配列(0, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 0, 7, 5),
- 101 => array(4, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 8, 6),
- 102 =>配列(0, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0, 9, 7),
- 103 =>配列(0, 30, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 0, 10, 8),
- 104 => array(2, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 1, 9),
- 105 =>配列(0, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 2, 10),
- 106 => array(7, 30, 29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 3, 11),
- 107 =>配列(0, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 30, 0, 4, 12),
- 108 =>配列(0, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 0, 5, 1),
- 109 => array(5, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 6, 2),
- 110 =>配列(0, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0, 7, 3),
- 111 =>配列(0, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0, 8, 4)、
- 112 => 配列(4, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 9, 5),
- 113 => 配列(0, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 0, 10, 6),
- 114 => array(9, 29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 1, 7),
- 115 => array(0, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 30, 29, 0, 2, 8)、
- 116 => 配列(0, 30, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 0, 3, 9)、
- 117 => 配列(6, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 4, 10),
- 118 => 配列(0, 29, 30) , 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 0, 5, 11),
- 119 => 配列(0, 30, 29, 30, 29, 30, 29, 29) 、30、29、29、30、30、0、6、12)、
- 120 => 配列(4、29、30、30、30、29、30、29、29、30、29、30、29) , 30, 7, 1)
- );
-
- $mten = $lnlunarcalendar['tiangan'];// 月の天の幹
- $mtwelve = $lnlunarcalendar['dizhi'];// 月の地上の枝
- $mmonth = $ lnlunarcalendar ['month'];// 太陰月
- $mday = $lnlunarcalendar['day'];// 太陰日
- // 1900 年 12 月 21 日までのグレゴリオ暦の合計日数
- $total = 69 * 365 + 17 + 11 ;
- //1970 年 1 月 1 日より前のことはカウントされません
- if ($year == "" || $month == "" || ($year < 1970 or $year > 2020)) return ' '; //この範囲を超える計算はありません
- // 1900 年 12 月 21 日から、要求された日付までのグレゴリオ暦の合計日数を計算します
-
- for ($y = 1970; $y $total += 365;
- if ($y % 4 == 0) $total ++;
- }
- // 今年の月を加算します
- $ total += gmdate(" z", gmmktime(0, 0, 0, $month, 1, $year));
- // 旧暦の累積日数を使用して、旧暦の日数を超えているかどうかを判断します太陽暦
- $flag1 = 0; //ループから抜け出す条件を判定
- $lcj = 0;
- while ($lcj $lci = 1;
- while ($lci $mtotal += $everymonth[$lcj][$lci];
- if ($mtotal >= $total) {
- $flag1 = 1;
- Break;
- }
- $lci++;
- }
- if ($flag1 == 1) Break;
- $lcj++;
- }
- // 上記から、取得された $lci は現在の太陰月、$lcj は現在の太陰年です
- // 1 日の太陰日付を計算しますリクエストされた月
- $fisrtdaylunar = $everymonth[$lcj][$lci] - ($mtotal - $total) ;
- $results['year'] = $mten[$everymonth[$lcj][14]] $ mtwelve[$everymonth[$lcj][15]]; //今は何年ですか? $daysthismonth = gmdate( "t", gmmktime(0, 0, 0, $month, 1, $year)) / /今月の日数
- $op = 1;
- for ($i = 1; $i $possiblelunarday = $fisrtdaylunar + $op-1; //理論的には重ね合わせた太陰日
- if ($possiblelunarday <= $everymonth[$lcj][$lci]) { // これは月内の日数の範囲内
- $results[$i] = $mday[$possiblelunarday];
- $op += 1;
- }
- else { // 今月の日の範囲内ではありません
- $results[$i] = $ mday[1] // 1 日目に戻ります
- $fisrtdaylunar = 1;
- ; $op = 2;
- $curmonthnum = ($everymonth[$lcj][0] != 0) ? 13 : 12; //今年は月があります
- if ($lci + 1 > $curmonthnum) { // 13/14番目の月です、次の年へ
- $lci = 1;
- $lcj = $lcj + 1;
- // 変更 年末なので新年の干支をメモしておきます
- $ results['year'] .= '/' . $mten[$everymonth[$lcj][14]] . $mtwelve[$everymonth[$lcj] [15]];
- }
- else { // このままですyear
- $lci = $lci + 1;
- $lcj = $lcj;
- }
- }
- if ($results[$i] == $mday [1]) { // 各月の最初の日に表示される内容month その月は
- if ($everymonth[$lcj][0] != 0) { // 閏月のある年
- $monthss = ($lci > $everymonth[$lcj][0]) ($lci) -1) : $lci; // 閏月後の月数 - 1
- if ($lci == $everymonth[$lcj][0] + 1) { // 今月はたまたま閏月です
- $monthssshow = $mmonth[$months]; //閏月を前に追加します
- $runyue = 1;
- }
- else {
- $monthssshow = $mmonth[$ monthss];
- }
- }
- else {
- $monthss = $lci;
- $monthssshow = $mmonth[$monthss];
- }
- if ($monthss $monthssshow .= $mmonth[13];
- }
- $results[$i] = $monthssshow;
- }
- }
- return $results;
- }
- // これを追加するのを忘れていました: 旧暦の文字
- $lnlunarcalendar = array(
- 'tiangan' => array("Unknown", "A", "B", "C", "D", "五" , "Ji", "Geng", "Xin", "ren", "縸"),
- 'dizhi' => array("Unknown", "Zi Nian (ネズミ)", "Chou Nian (牛)" , 「イン・ニアン(虎)」、「マオ・ニアン(ウサギ)」、「チェン・ニアン(龍)」、
- 「シ・ニアン(蛇)」、「ウー・ニアン(馬)」、「ウェイ・ニアン(羊)」、シェンニアン(申)、「ヨウニアン(酉)」、「シューニアン(犬)」、「ハイニアン(豚)」),
- '月' => array("闰", "正", "二」、「三」、「四」、「五」、「六」、
- 「七」、「八」、「九」、「十」、「十一」、「十二」、「月」)、
- 'day' => array("不明", "中学校 1 日目", "中学校 2 日目", "中学校 3 日目", "中学校 4 日目", "中学校 5 日目" 「中学の日」、「中学6日」、「中学7日」、「8日」、「9日」、「10日」、
- 「11日」、「12日」、「13日」 "、"14番目"、"15番目"、"16番目"、"17番目"、" 18"、"19"、"20"、
- "21"、"22"、"23"、"二十四", "二五", "二六", "二七", "忿八", "忿九", "十三")
- );
-
コードをコピー
|