サンプル・プログラムの実行例
目次
サンプル・プログラムのダウンロード
| midAutumnMoon.php | サンプル・プログラム |
| pahooInputData.php | データ入力に関わる関数群。 使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。 |
| pahooCalendar.php | 暦・潮位計算クラス pahooCalendar。 暦・潮位計算クラスの使い方は「PHPで二十四節気・七十二候一覧を作成」「PHPで月齢を計算」「PHPで日出没・月出没・月齢・潮を計算」「PHPで潮位を計算する」などを参照。include_path が通ったディレクトリに配置すること。 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 1.0.0 | 2025/10/08 | 初版 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 2.0.1 | 2025/08/11 | getParam() bug-fix |
| 2.0.0 | 2025/08/11 | pahooLoadEnv() 追加 |
| 1.9.0 | 2025/07/26 | getParam() 引数に$trim追加 |
| 1.8.1 | 2025/03/15 | validRegexPattern() debug |
| 1.8.0 | 2024/11/12 | validRegexPattern() 追加 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 4.6.0 | 2025/10/08 | getMidAutumnMoon() 追加 |
| 4.5.1 | 2025/05/31 | deg2ddmm(), deg2hhmm() 不具合修正 |
| 4.5.0 | 2024/03/17 | ヒジュラ暦メソッドを追加 |
| 4.4.1 | 2024/03/17 | getCabinetOfficeHolidayTable() -- bug-fix |
| 4.4.0 | 2024/02/25 | 内閣府の祝日表を参照できるようにした |
各種定数
midAutumnMoon.php
59: // 各種定数(START) ===========================================================
60:
61: // 表示幅(単位:ピクセル)
62: define('WIDTH', 600);
63:
64: // 計算期間(単位:年)
65: define('YEAR_RANGE', 5);
66:
67: // 一覧表の行背景色
68: // 満月の背景色
69: define('COLOR_FULLMOON', '#FFFFFF');
70: // 中秋の名月の背景色
71: define('COLOR_MIDAUTUMNMOON', '#FFFFCC');
72:
73: // Spinner - jQuery UI を使用するかどうか
74: define('USESPINNER', TRUE);
75:
76: // 数値増減クリックで即計算するかどうか(TRUE:即計算,FALE:計算ボタンを用意)
77: define('ONCHANGE', FALSE);
78:
79: // 指定できる西暦年の範囲
80: define('MIN_YEAR', 1901);
81: define('MAX_YEAR', 2099);
82:
83: // 表示言語(jp:日本語, en:英語, en3:英語略記)
84: define('LANGUAGE', 'jp');
85:
86: // 世界時からの時差(日本標準時)
87: define('UTCDIFF', +9.0);
88:
89: // 2033年問題解決案1~3のいずれか
90: // 参考ページ https://www.pahoo.org/e-soul/webtech/php02/php02-45-01.shtm#php_resolveLunarCalendar2033
91: define('LCP2033', 1);
92:
93: // 満月の日時を探索する範囲(日);中秋の名月の日を基準にする前後日数
94: define('SEARCH_RANGE', 7);
95:
96: // 各種定数(END) ==============================================================
MIN_YEAR、MAX_YEAR であるが、「解説:旧暦2033年問題の解決案 - PHPで万年カレンダーを作る」で述べたように、西暦2033年(令和15年)から2034年にかけ旧暦(天保暦)が正しく定義されていないため、LCP2033 に1から3のいずれかの値を代入する必要がある。
「中秋の名月」の日(西暦年月日)を求める
処理は単純で、makeLunarCalendarメソッドを使って旧暦カレンダー表を作ったら、そこから旧暦8月1日を探す。
見つかったら、その14日後が旧暦8月15日であるから、ユリウス暦 JD に 14 を加算し、JD2Gregorianメソッドを使って西暦年月日を得る。
pahooCalendar.php
2800: /**
2801: * 指定した西暦年における「中秋の名月」の日(西暦年月日)を求める.
2802: * 参考サイト https://www.pahoo.org/e-soul/webtech/php02/php02-67-01.shtm
2803: * @param int $year 西暦年
2804: * @param int $method 2033年問題解決案
2805: * 0:解決しない,1:案1,2:案2,3:案3(省略時:0)
2806: * @return array(西暦年,月,日)/FALSE:取得失敗
2807: */
2808: function getMidAutumnMoon($year, $method=0) {
2809: // 旧暦カレンダーが未作成の時に作成する.
2810: if (! isset($this->tblmoon) || (count($this->tblmoon) == 0)) {
2811: $this->makeLunarCalendar($year, $method);
2812: }
2813:
2814: // 旧暦8月1日を探す.
2815: $jd = 0;
2816: foreach ($this->tblmoon as $items) {
2817: if (($items['year'] == $year) && ($items['oldmonth'] == 8)) {
2818: $jd = $items['jd'];
2819: break;
2820: }
2821: }
2822:
2823: // 旧暦8月1日が見つからなかった場合,旧暦カレンダーを再計算する
2824: if ($jd === 0) {
2825: $this->makeLunarCalendar($year, $method);
2826: // 旧暦8月1日を探す.
2827: foreach ($this->tblmoon as $items) {
2828: if (($items['year'] == $year) && ($items['oldmonth'] == 8)) {
2829: $jd = $items['jd'];
2830: break;
2831: }
2832: }
2833: if ($jd === 0) return FALSE;
2834: }
2835:
2836: $jd = $jd + 14;
2837: return $this->JD2Gregorian($jd);
2838: }
「中秋の名月」の日(西暦年月日)を求める
まず、上述のメソッド getMidAutumnMoon を求め、その日から定数 SEARCH_RANGE日前を基準に、next_fullmoon メソッドを使って、その次の満月の年月日時分を求める。
年月日の文字列を戻す(満月と中秋の名月で2つの文字列配列)。このとき、満月は時分まで戻すようにする。また、中秋の名月と満月の日を比較して、年月日の小さい順に配列として返す。
midAutumnMoon.php
221: /**
222: * 指定した年の中秋の名月と,その近くの満月の日時を計算する
223: * @param int $year 計算年(西暦)
224: * @return array(中秋の名月の日,満月の日時)/FALSE:計算失敗
225: */
226: function calcFullMoon($year) {
227: //暦計算に関わるクラス
228: $pcl = new pahooCalendar(LANGUAGE, UTCDIFF);
229:
230: // 中秋の名月の年月日を求める
231: $midAutumnMoon = $pcl->getMidAutumnMoon($year, LCP2033);
232: if ($midAutumnMoon === FALSE) {
233: $pcl = NULL;
234: return FALSE;
235: }
236:
237: // 中秋の名月に近い満月の日時を求める
238: $fullMoon = $pcl->next_fullmoon($year, $midAutumnMoon[1], $midAutumnMoon[2] - SEARCH_RANGE, 0, 0, 0);
239:
240: // 月日比較用文字列を作成
241: $mmddFullMoon = sprintf('%02d%02d', $fullMoon[1], $fullMoon[2]);
242: $mmddMidAutumnMoon = sprintf('%02d%02d', $midAutumnMoon[1], $midAutumnMoon[2]);
243:
244: // 戻り値の文字列を作成
245: $week = $pcl->getWeekString($fullMoon[0], $fullMoon[1], $fullMoon[2]);
246: $resFullMoon = sprintf('%04d年%02d月%02d日(%s) %02d:%02d', $fullMoon[0], $fullMoon[1], $fullMoon[2], $week, $fullMoon[3], $fullMoon[4] + round($fullMoon[5] / 60.0, 0));
247: $week = $pcl->getWeekString($midAutumnMoon[0], $midAutumnMoon[1], $midAutumnMoon[2]);
248: $resMidAutumnMoon = sprintf('%04d年%02d月%02d日(%s)', $midAutumnMoon[0], $midAutumnMoon[1], $midAutumnMoon[2], $week);
249:
250: // オブジェクト解放
251: $pcl = NULL;
252:
253: return ($mmddFullMoon < $mmddMidAutumnMoon) ? array($resFullMoon, $resMidAutumnMoon) : array($resMidAutumnMoon, $resFullMoon);
254: }
中秋の名月・満月の一覧を求める
midAutumnMoon.php
363: // 中秋の名月・満月の一覧を求める.
364: $cnt = 0;
365: if ($errmsg === '') {
366: for ($y = $year; $y <= $year + YEAR_RANGE; $y++) {
367: $arr = calcFullMoon($y);
368: if ($arr === FALSE) {
369: $errmsg = '満月または中秋の名月の算出に失敗しました.';
370: break;
371: }
372: $items[$cnt] = $arr[0];
373: $cnt++;
374: $items[$cnt] = $arr[1];
375: $cnt++;
376: }
377: }

「PHPでスーパームーンを計算する」で満月が起きる年月日時分を計算するプログラムを紹介した。これを活用し、中秋の名月の日と、その近くで起きる満月の日を一覧表示する PHPプログラムを作る。