PHPで土用を求める

(1/1)
炭や一風の天然うなぎ蒲焼
炭や一風の天然うなぎ蒲焼
土用の丑の日といえばウナギである。土用の期間は太陽黄経から、丑の日は日の干支から求めることができる。
今回は、PHP を使って指定した年の土用と丑の日を一覧表示するプログラムを作ってみよう。

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

PHPで土用を求める

サンプル・プログラム

圧縮ファイルの内容
getDoyo.phpサンプル・プログラム本体。
pahooCalendar.php暦計算クラス pahooCalendar。
暦計算クラスの使い方は「PHPで日出没・月出没・月齢・潮を計算」を参照。include_path が通ったディレクトリに配置すること。

土用の丑の日とは

土用の丑の日といえば、うなぎを食べる風習がある。江戸時代、平賀源内が宣伝したことでこの風習が広まったとされるが、そもそも土用の丑の日とは、どうやって決めるのだろうか。
四季と土用
むかし、中国で陰陽五行説の 5 つの要素(木・火・土・金・水)を四季(春・夏・秋・冬)に対応させようとした。そこで、春・夏・秋・冬の各々に木・火・土・金を 1 対 1 対応させ、各季節の最後の約 18 日に残ったを割り当てた。この約 18 日間を土用と呼ぶ。
左図のように、立春の前日までが冬の土用、立夏の前日までが春の土用、立秋の前日までが夏の土用、立冬の前日までが秋の土用となる。
土用の入りと明けは太陽黄経で定義できる。
季節 太陽黄経
土用の入り 土用の明け
297度 315度(立春)の前日
27度 45度(立夏)の前日
117度 135度(立秋)の前日
207度 225度(立冬)の前日
土用の丑の日は、土用の期間中の丑の日のことである。とくに夏の土用に対して用いられる。
日の干支は、「干支と十二支の計算 - PHP で 3 ヶ月カレンダーを作る」をご覧頂きたい。日の干支は 12 日で 1 周するので、土曜の期間中に丑の日が 2 回来るケースがある。ここでは、最初に来る丑の日を土用の丑の日とする。

準備:外部クラスなど

0036: //表示幅(ピクセル)
0037: define('WIDTH', 600);
0038: 
0039: //西暦年の選択範囲(年)
0040: define('INTERVAL', 5);
0041: 
0042: //暦計算クラス
0043: require_once('pahooCalendar.php');

土用の計算はなど、ユーザークラス "pahooCalendar" に用意したメソッド群を利用する。クラスファイル "pahooCalendar.php" を  require_once  し、オブジェクトを生成する。

解説:土用を求める

0762: /**
0763:  * その年の土用を求める
0764:  * @param   int $year 西暦年
0765:  * @return  array   [0]['in']['year','month','day']     冬の土用の入り
0766:  *                     ['ushi']['year','month','day']   冬の土用の丑の日
0767:  *                     ['out']['year','month','day']    冬の土用の明け
0768:  *                  [1]                                 春の土用の入り/明け
0769:  *                  [2]                                 夏の土用の入り/明け
0770:  *                  [3]                                 秋の土用の入り/明け
0771: */
0772: function getDoyo($year) {
0773:     static $table1 = array(297, 360, 27, 117, 207, 297);
0774:     static $table2 = array(315, 360, 45, 135, 225, 315);
0775:     $key  = 0;
0776:     $flag = 0;           //土用期間中フラグ
0777:     $doyo = array(); //土用の入り/明けを格納
0778: 
0779:     for ($month = 1; $month <= 12; $month++) {
0780:         $day_in_month = $this->getDaysInMonth($year$month);
0781:         for ($day = 1; $day <= $day_in_month$day++) {
0782:             //太陽黄経
0783:             $l1 = $this->longitude_sun($year$month$day, 24, 0, 0);
0784:             $l2 = $this->longitude_sun($year$month$day, 48, 0, 0);
0785:             //入り判定
0786:             if (($flag == 0) && ($l1 > $table1[$key]) && ($l1 <= $table1[$key + 1])) {
0787:                 $key2 = ($key > 0) ? $key - 1 : $key;
0788:                 $doyo[$key2]['in']['year']  = $year;
0789:                 $doyo[$key2]['in']['month'] = $month;
0790:                 $doyo[$key2]['in']['day']   = $day;
0791:                 $flag = 1;
0792:             }
0793:             if ($flag > 0) {
0794:                 //明け判定
0795:                 if (($l2 >= $table2[$key]) && ($l2 <= $table2[$key + 1])) {
0796:                     $key2 = ($key > 0) ? $key - 1 : $key;
0797:                     $doyo[$key2]['out']['year']  = $year;
0798:                     $doyo[$key2]['out']['month'] = $month;
0799:                     $doyo[$key2]['out']['day']   = $day;
0800:                     $key++;
0801:                     $flag = 0;
0802:                     if ($key == 1)  $key++;
0803:                     if ($key > 4)   return $doyo;
0804:                 //丑の日判定
0805:                 } else if (($flag == 1) && (preg_match('/丑/ui', $this->eto_day($year$month$day)) > 0)) {
0806:                     $key2 = ($key > 0) ? $key - 1 : $key;
0807:                     $doyo[$key2]['ushi']['year']  = $year;
0808:                     $doyo[$key2]['ushi']['month'] = $month;
0809:                     $doyo[$key2]['ushi']['day']   = $day;
0810:                     $flag++;
0811:                 }
0812:             }
0813:         }
0814:     }
0815:     return $doyo;
0816: }

土用は、メソッド getDoyo で求める。
指定した年の 1 月 1 日から毎日の太陽黄経を計算し、翌日(24 時間後)が 297 度、27 度、117 度、207 度を超えたら、土用の入りとして年月日を配列 $doyo に代入し、$flag に 1 を代入する。
日の干支を求め、最初にの文字が入っていた日を土用の丑の日として年月日を配列 $doyo に代入し、$flag に 2 を代入する。
太陽黄経が、翌々日(48 時間後)が 315 度(立春)、45 度(立夏)、135 度(立秋)、225 度(立冬)を超えたら、土用の明けとして年月日を配列 $doyo に代入し、$flag を 0 に戻す。
太陽黄経は、途中で 360 度を超えて 0 度に戻るところを配列 $table1, $table2 について工夫している。

参考サイト

(この項おわり)
header