PHPで中秋の名月と満月の一覧を表示する

(1/1)
中秋の名月は旧暦8月15日の月である。この日が満月とは限らないということは、「中秋の名月は満月とは限らない」で述べたとおりだ。
PHPでスーパームーンを計算する」で満月が起きる年月日時分を計算するプログラムを紹介した。これを活用し、中秋の名月の日と、その近くで起きる満月の日を一覧表示する PHPプログラムを作る。

サンプル・プログラムの実行例

中秋の名月と満月を一覧表示

目次

サンプル・プログラムのダウンロード

圧縮ファイルの内容
midAutumnMoon.phpサンプル・プログラム
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
pahooCalendar.php暦・潮位計算クラス pahooCalendar。
暦・潮位計算クラスの使い方は「PHPで二十四節気・七十二候一覧を作成」「PHPで月齢を計算」「PHPで日出没・月出没・月齢・潮を計算」「PHPで潮位を計算する」などを参照。include_path が通ったディレクトリに配置すること。
midAutumnMoon.php 更新履歴
バージョン 更新日 内容
1.0.0 2025/10/08 初版
pahooInputData.php 更新履歴
バージョン 更新日 内容
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() 追加
pahooCalendar.php 更新履歴
バージョン 更新日 内容
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_YEARMAX_YEAR であるが、「解説:旧暦2033年問題の解決案 - PHPで万年カレンダーを作る」で述べたように、西暦2033年(令和15年)から2034年にかけ旧暦(天保暦)が正しく定義されていないため、LCP2033 に1から3のいずれかの値を代入する必要がある。

「中秋の名月」の日(西暦年月日)を求める

メソッド getMidAutumnMoon は、指定した西暦年における「中秋の名月」の日(西暦年月日)を求める。
処理は単純で、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: }

「中秋の名月」の日(西暦年月日)を求める

関数 calcFullMoon は、指定した西暦年における「中秋の名月」の日と、それに近い満月の日を求める。
まず、上述のメソッド 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: }

中秋の名月・満月の一覧を求める

メイン・プログラムでは、定数 YEAR_RANGE で指定した年数だけ、前述の関数 calcFullMoon を呼び出し、中秋の名月と満月の日付を配列 $items に格納していく。

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: }

参考サイト

(この項おわり)
header