サンプル・プログラムの実行例
サンプル・プログラム
getDoyo.php | サンプル・プログラム本体。 |
pahooCalendar.php | 暦・潮位計算クラス pahooCalendar。 暦・潮位計算クラスの使い方は「PHPで二十四節気・七十二候一覧を作成」「PHPで月齢を計算」「PHPで日出没・月出没・月齢・潮を計算」「PHPで潮位を計算する」などを参照。include_path が通ったディレクトリに配置すること。 |
pahooInputData.php | データ入力に関わる関数群。 使い方は「PHPでGET/POSTでフォームから値を受け取る」「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。 |
バージョン | 更新日 | 内容 |
---|---|---|
1.1.0 | 2023/01/15 | 二の丑に対応,数値入力にpahooInputData導入 |
1.0 | 2021/08/01 | 初版 |
バージョン | 更新日 | 内容 |
---|---|---|
4.3.2 | 2023/02/11 | getSolarTerm72() 表記改訂:水澤腹堅→水沢腹堅 |
4.3.1 | 2023/02/03 | 表記改訂:バクムーン→バックムーン,スタージャンムーン→スタージョンムーン,七十二候 |
4.3.0 | 2023/01/14 | コメント表記などを見直した,tenshanichi()追加 |
4.2.0 | 2023/01/11 | getTimeDifference(),setTimeDifference()追加 |
4.1.0 | 2023/01/09 | 太陽,月の位置計算の基準をUTCに変更した |
バージョン | 更新日 | 内容 |
---|---|---|
1.5.0 | 2024/01/28 | exitIfExceedVersion() 追加 |
1.4.2 | 2024/01/28 | exitIfLessVersion() メッセージ修正 |
1.4.1 | 2023/09/30 | コメントの訂正 |
1.4.0 | 2023/09/09 | $_GET, $_POST参照をfilter_input()関数に置換 |
1.3.0 | 2023/07/11 | roundFloat() 追加 |
左図のように、立春の前日までが冬の土用、立夏の前日までが春の土用、立秋の前日までが夏の土用、立冬の前日までが秋の土用となる。
季節 | 太陽黄経 | |
---|---|---|
土用の入り | 土用の明け | |
冬 | 297度 | 315度(立春)の前日 |
春 | 27度 | 45度(立夏)の前日 |
夏 | 117度 | 135度(立秋)の前日 |
秋 | 207度 | 225度(立冬)の前日 |
日の干支は、「干支と十二支の計算 - PHPで3ヶ月カレンダーを作る」をご覧頂きたい。日の干支は12日で1周するので、土曜の期間中に丑の日が2回来るケースがある。2回目の丑の日を二の丑と呼ぶことがある。
準備:初期値など
36: //指定できる西暦年の範囲
37: define('MIN_YEAR', 1901);
38: define('MAX_YEAR', 2099);
39:
40: //表示言語(jp:日本語, en:英語, en3:英語略記)
41: define('LANGUAGE', 'jp');
42:
43: //世界時からの時差(日本標準時)
44: define('UTCDIFF', +9.0);
45:
46: //西暦年の選択範囲(年)
47: define('INTERVAL', 5);
48:
49: //丑の日の背景色
50: define('COLOR_USHI', 'gold');
51:
52: //表示幅(ピクセル)
53: define('WIDTH', 600);
54:
55: //require_once()で呼ぶファイルはinclude_pathが通っているフォルダに配置すること。
56: //暦計算クラス
57: require_once('pahooCalendar.php');
58:
59: //データ入力に関わる関数群
60: require_once('pahooInputData.php');
土用の日を求めるには、ユーザークラス "pahooCalendar" に用意したメソッド群を利用する。
オブジェクト生成時に、表示言語として "ja"(日本語)を、世界時との時差としてユーザー定義の定数 UTCDIFF を渡しておく。こうすることで、pahooCalendar クラスが出力する文字列は日本語に、日時計算は時差 UTCDIFF がある前提で計算を行う。
入力した数値の取得とバリデーションチェックに、ユーザー定義クラス群 "pahooInputData.php" を利用している。
解説:土用を求める
1137: /**
1138: * 指定した年の土用を求める.
1139: * 参考サイト https://www.pahoo.org/e-soul/webtech/php02/php02-45-01.shtm#php_isDoyo
1140: * @param int $year 西暦年
1141: * @return array [0]['in']['year','month','day'] 冬の土用の入り
1142: * ['ushi']['year','month','day'] 冬の土用の丑の日
1143: * ['out']['year','month','day'] 冬の土用の明け
1144: * [1] 春の土用の入り/明け
1145: * [2] 夏の土用の入り/明け
1146: * [3] 秋の土用の入り/明け
1147: */
1148: function getDoyo($year) {
1149: static $table1 = array(297, 360, 27, 117, 207, 297);
1150: static $table2 = array(315, 360, 45, 135, 225, 315);
1151: $key = 0;
1152: $flag = 0; //土用期間中フラグ
1153: $doyo = array(); //土用の入り/明けを格納
1154:
1155: for ($month = 1; $month <= 12; $month++) {
1156: $day_in_month = $this->getDaysInMonth($year, $month);
1157: for ($day = 1; $day <= $day_in_month; $day++) {
1158: //太陽黄経
1159: $l1 = $this->longitude_sun($year, $month, $day, 24, 0, 0);
1160: $l2 = $this->longitude_sun($year, $month, $day, 48, 0, 0);
1161: //入り判定
1162: if (($flag == 0) && ($l1 > $table1[$key]) && ($l1 <= $table1[$key + 1])) {
1163: $key2 = ($key > 0) ? $key - 1 : $key;
1164: $doyo[$key2]['in']['year'] = $year;
1165: $doyo[$key2]['in']['month'] = $month;
1166: $doyo[$key2]['in']['day'] = $day;
1167: $flag = 1;
1168: }
1169: if ($flag > 0) {
1170: //明け判定
1171: if (($l2 >= $table2[$key]) && ($l2 <= $table2[$key + 1])) {
1172: $key2 = ($key > 0) ? $key - 1 : $key;
1173: $doyo[$key2]['out']['year'] = $year;
1174: $doyo[$key2]['out']['month'] = $month;
1175: $doyo[$key2]['out']['day'] = $day;
1176: $key++;
1177: $flag = 0;
1178: if ($key == 1) $key++;
1179: if ($key > 4) return $doyo;
1180: //丑の日判定
1181: } else if (($flag == 1) && (preg_match('/丑/ui', $this->eto_day($year, $month, $day)) > 0)) {
1182: $key2 = ($key > 0) ? $key - 1 : $key;
1183: $doyo[$key2]['ushi']['year'] = $year;
1184: $doyo[$key2]['ushi']['month'] = $month;
1185: $doyo[$key2]['ushi']['day'] = $day;
1186: $flag++;
1187: if ($key > 4) return $doyo;
1188: //二の丑の日判定
1189: } else if (($flag == 2) && (preg_match('/丑/ui', $this->eto_day($year, $month, $day)) > 0)) {
1190: $key2 = ($key > 0) ? $key - 1 : $key;
1191: $doyo[$key2]['ushi2']['year'] = $year;
1192: $doyo[$key2]['ushi2']['month'] = $month;
1193: $doyo[$key2]['ushi2']['day'] = $day;
1194: $flag++;
1195: }
1196: }
1197: }
1198: }
1199: return $doyo;
1200: }
指定した年の1月1日から毎日の太陽黄経を計算し、翌日(24時間後)が297度、27度、117度、207度を超えたら、土用の入りとして年月日を配列 $doyo に代入し、$flag に1を代入する。
日の干支を求め、最初に丑の文字が入っていた日を土用の丑の日として年月日を配列 $doyo に代入し、$flag に2を代入する。
次に丑の文字が見つかったら、二の丑として年月日を配列 $doyo に代入し、$flag に3を代入する。
太陽黄経が、翌々日(48時間後)が315度(立春)、45度(立夏)、135度(立秋)、225度(立冬)を超えたら、土用の明けとして年月日を配列 $doyo に代入し、$flag を0に戻す。
太陽黄経は、途中で360度を超えて0度に戻るところを配列 $table1, $table2 について工夫している。
参考サイト
- PHPで3ヶ月カレンダーを作る:ぱふぅ家のホームページ
- PHPで二十四節気・七十二候一覧を作成:ぱふぅ家のホームページ
- 四万十川のウナギはワイルドだが脂っこくない:ぱふぅ家のホームページ
- 土用(雑節)]:日本の行事・暦
- 【土用の丑の日】2021年はいつ?7月・8月にうなぎを食べる意味や由来、風習など:じゃらんニュース
今回は、PHPを使って指定した年の土用と丑の日を一覧表示するプログラムを作ってみよう。