目次
サンプル・プログラムの実行例
サンプル・プログラムのダウンロード
getSolarTerm.php | サンプル・プログラム本体。 |
pahooCalendar.php | 暦・潮位計算クラス pahooCalendar。 暦・潮位計算クラスの使い方は「PHPで二十四節気・七十二候一覧を作成」「PHPで月齢を計算」「PHPで日出没・月出没・月齢・潮を計算」「PHPで潮位を計算する」などを参照。include_path が通ったディレクトリに配置すること。 |
pahooInputData.php | データ入力に関わる関数群。 使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。 |
バージョン | 更新日 | 内容 |
---|---|---|
1.5.2 | 2023/02/11 | 節分の月日表記の不具合修正 |
1.5.1 | 2023/01/17 | bug-fix |
1.5.0 | 2023/01/14 | 数値入力にSpinner、pahooInputData導入 |
1.4.0 | 2023/01/09 | 計算精度向上 |
1.3 | 2021/01/23 | 節分を表示,PHP8対応 |
バージョン | 更新日 | 内容 |
---|---|---|
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() 追加 |
二十四節気・七十二候とは
が、実際の太陽系は、太陽の回りを地球が公転する地動説であるため、同じ黄経・黄緯の位置にある天体でも、地球の位置によって若干のズレ(年周視差)が起き、さらに光の速度が有限であるため、年周光行差となって表れる。同様に、地球の自転による日周光行差もある。
話を二十四節気に戻すと、この二十四節気というものは、黄道を24等分――太陽は黄道に沿って動くので黄緯は常に0度――つまり、視黄経の15度ごとに区切った点に決められている。
春分が0度で、清明は15度、穀雨は30度‥‥啓蟄は345度である。
また、立春、立夏、立秋、立冬が各季節の始まりとされ、その前日を節分と呼ぶ。現代では立春の前日を節分と呼んでいる。
二十四節気をさらに5日おきに分けて、気象の動きや動植物の変化を知らせるようにしたのが七十二候である。
ちなみに「気候」という言葉は、「節気」と「候」に由来する。
準備:初期値など
36: //指定できる西暦年の範囲
37: define('MIN_YEAR', 1901);
38: define('MAX_YEAR', 2099);
39:
40: //世界時からの時差(日本標準時)
41: define('UTCDIFF', +9.0);
42:
43: //計算期間(月)
44: define('CALC_TERM', 3);
45:
46: //月齢を計算する時刻
47: define('CALC_HOUR', 21);
48:
49: //Spinner - jQuery UI を使用するかどうか
50: define('USESPINNER', TRUE);
51:
52: //数値増減クリックで即判定するかどうか(TRUE:即判定,FALE:判定ボタンを用意)
53: define('ONCHANGE', FALSE);
54:
55: //表示幅(単位:ピクセル)
56: define('WIDTH', 550);
57:
58: //require_once()で呼ぶファイルはinclude_pathが通っているフォルダに配置すること.
59: //暦計算クラス
60: require_once('pahooCalendar.php');
61:
62: //データ入力に関わる関数群
63: require_once('pahooInputData.php');
太陽黄経の計算や、二十四節気・七十二候の計算はユーザークラス "pahooCalendar" に分離した。
オブジェクト生成時に、表示言語として "ja"(日本語)を、世界時との時差としてユーザー定義の定数 UTCDIFF を渡しておく。こうすることで、pahooCalendar クラスが出力する文字列は日本語に、日時計算は時差 UTCDIFF がある前提で計算を行う。
数値入力に jQuery UI の Spinner を使用している。設定でOFFにすることもできる。Spinner の使い方については、「Spinner - jQuery UI - PHPで素数かどうか判定」をご覧いただきたい。
入力した数値の取得とバリデーションチェックに、ユーザー定義クラス群 "pahooInputData.php" を利用している。
解説:視黄経の算出
623: /**
624: * J2000.0からの経過年数における太陽の視黄経(度)を求める.
625: * 参考サイト https://www.pahoo.org/e-soul/webtech/php02/php02-42-01.shtm
626: * @param float $jy J2000.0からの経過年数
627: * @return float 太陽の視黄経(度)
628: */
629: function __longitude_sun($jy) {
630: $th = 0.0003 * sin(deg2rad($this->__angle(329.7 + 44.43 * $jy)));
631: $th += 0.0003 * sin(deg2rad($this->__angle(352.5 + 1079.97 * $jy)));
632: $th += 0.0004 * sin(deg2rad($this->__angle( 21.1 + 720.02 * $jy)));
633: $th += 0.0004 * sin(deg2rad($this->__angle(157.3 + 299.30 * $jy)));
634: $th += 0.0004 * sin(deg2rad($this->__angle(234.9 + 315.56 * $jy)));
635: $th += 0.0005 * sin(deg2rad($this->__angle(291.2 + 22.81 * $jy)));
636: $th += 0.0005 * sin(deg2rad($this->__angle(207.4 + 1.50 * $jy)));
637: $th += 0.0006 * sin(deg2rad($this->__angle( 29.8 + 337.18 * $jy)));
638: $th += 0.0007 * sin(deg2rad($this->__angle(206.8 + 30.35 * $jy)));
639: $th += 0.0007 * sin(deg2rad($this->__angle(153.3 + 90.38 * $jy)));
640: $th += 0.0008 * sin(deg2rad($this->__angle(132.5 + 659.29 * $jy)));
641: $th += 0.0013 * sin(deg2rad($this->__angle( 81.4 + 225.18 * $jy)));
642: $th += 0.0015 * sin(deg2rad($this->__angle(343.2 + 450.37 * $jy)));
643: $th += 0.0018 * sin(deg2rad($this->__angle(251.3 + 0.20 * $jy)));
644: $th += 0.0018 * sin(deg2rad($this->__angle(297.8 + 4452.67 * $jy)));
645: $th += 0.0020 * sin(deg2rad($this->__angle(247.1 + 329.64 * $jy)));
646: $th += 0.0048 * sin(deg2rad($this->__angle(234.95 + 19.341 * $jy)));
647: $th += 0.0200 * sin(deg2rad($this->__angle(355.05 + 719.981 * $jy)));
648: $th += (1.9146 - 0.00005 * $jy) * sin(deg2rad($this->__angle(357.538 + 359.991 * $jy)));
649: $th += $this->__angle(280.4603 + 360.00769 * $jy);
650:
651: return $this->__angle($th);
652: }
654: /**
655: * 指定した日時における太陽の視黄経(度)を求める.(日時はローカル時間).
656: * 参考サイト https://www.pahoo.org/e-soul/webtech/php02/php02-42-01.shtm
657: * @param int $year, $month, $day 年月日(グレゴリオ暦)
658: * @param float $hour, $min, $sec 時分秒(ローカル時間)
659: * @param float $tdiff UTCとの時差;NULLの時はTDIFF(省略時NULL)
660: * @return float 太陽の視黄経(度)
661: */
662: function longitude_sun($year, $month, $day, $hour, $min, $sec, $tdiff=NULL) {
663: $jy = $this->Gregorian2JY($year, $month, $day, $hour, $min, $sec, $tdiff);
664:
665: return $this->__longitude_sun($jy);
666: }
解説:二十四節気の算出
875: /**
876: * 指定した年月日の二十四節気を求める.
877: * 二十四節気でなければ空文字を返す.
878: * 参考サイト https://www.pahoo.org/e-soul/webtech/php02/php02-42-01.shtm
879: * @param int $year, $month, $day グレゴリオ暦による年月日
880: * @return string 二十四節気/'' :二十四節気ではない
881: */
882: function getSolarTerm($year, $month, $day) {
883: static $old = -1.0;
884: static $table = array(
885: 'jp' => array(
886: 0 => '春分', 1 => '清明', 2 => '穀雨', 3 => '立夏',
887: 4 => '小満', 5 => '芒種', 6 => '夏至', 7 => '小暑',
888: 8 => '大暑', 9 => '立秋', 10 => '処暑', 11 => '白露',
889: 12 => '秋分', 13 => '寒露', 14 => '霜降', 15 => '立冬',
890: 16 => '小雪', 17 => '大雪', 18 => '冬至', 19 => '小寒',
891: 20 => '大寒', 21 => '立春', 22 => '雨水', 23 => '啓蟄'
892: ),
893: 'en' => array(
894: 0 => 'Sprinf Equinox',
895: 1 => 'Fresh Green',
896: 2 => 'Grain Rain',
897: 3 => 'Beginning of Summer',
898: 4 => 'Lesser Fullness',
899: 5 => 'Grain in Ear',
900: 6 => 'Summer Solstice',
901: 7 => 'Lesser Heat',
902: 8 => 'Greater Heat',
903: 9 => 'Beginning of Autumn',
904: 10 => 'End of Heat',
905: 11 => 'White Dew',
906: 12 => 'Autumnal Equinox',
907: 13 => 'Cold Dew',
908: 14 => 'First Frost',
909: 15 => 'Beginning of Winter',
910: 16 => 'Light Snow',
911: 17 => 'Heavy Snow',
912: 18 => 'White Solstice',
913: 19 => 'Lesser Cold',
914: 20 => 'Greter Cold',
915: 21 => 'Begining of Spring',
916: 22 => 'Rain Water',
917: 23 => 'Insects Awakening',
918: ),
919: 'en3' => array(
920: 0 => 'Sprinf Equinox',
921: 1 => 'Fresh Green',
922: 2 => 'Grain Rain',
923: 3 => 'Beginning of Summer',
924: 4 => 'Lesser Fullness',
925: 5 => 'Grain in Ear',
926: 6 => 'Summer Solstice',
927: 7 => 'Lesser Heat',
928: 8 => 'Greater Heat',
929: 9 => 'Beginning of Autumn',
930: 10 => 'End of Heat',
931: 11 => 'White Dew',
932: 12 => 'Autumnal Equinox',
933: 13 => 'Cold Dew',
934: 14 => 'First Frost',
935: 15 => 'Beginning of Winter',
936: 16 => 'Light Snow',
937: 17 => 'Heavy Snow',
938: 18 => 'White Solstice',
939: 19 => 'Lesser Cold',
940: 20 => 'Greter Cold',
941: 21 => 'Begining of Spring',
942: 22 => 'Rain Water',
943: 23 => 'Insects Awakening',
944: ));
945:
946: //表示言語を設定する.
947: $lng = 'jp'; //デフォルトは日本語
948: foreach ($table as $key=>$arr) {
949: if (preg_match('/^' . $key . '$/i', $this->language) > 0) {
950: $lng = $key;
951: break;
952: }
953: }
954:
955: //太陽黄経を計算する.
956: $l1 = $this->longitude_sun($year, $month, $day, 0, 0, 0);
957: $l2 = $this->longitude_sun($year, $month, $day, 24, 0, 0);
958: $n1 = floor($l1 / 15.0);
959: $n2 = floor($l2 / 15.0);
960:
961: return ($n1 != $n2) ? $table[$lng][$n2] : '';
962: }
直前の呼ばれた時の二十四節気をstatic変数 $old にn保持しておき、そこから視黄経が15度以上離れたら、新しい二十四節気を配列 $table から取り出して返す。
解説:七十二候の算出
1001: /**
1002: * 指定した年月日の七十二候を求める.
1003: * 七十二候でなければ空文字を返す.
1004: * 参考サイト https://www.pahoo.org/e-soul/webtech/php02/php02-42-01.shtm
1005: * @param int $year, $month, $day グレゴリオ暦による年月日
1006: * @return string 七十二候/'' :七十二候ではない
1007: */
1008: function getSolarTerm72($year, $month, $day) {
1009: static $old = -1.0;
1010: //七十二候(参考)国立天文台暦計算室 https://eco.mtk.nao.ac.jp/koyomi/wiki/B5A8C0E12FBCB7BDBDC6F3B8F5.html 「宝暦暦以降」による
1011: static $table = array(
1012: 0 => '雀始巣',
1013: 1 => '桜始開',
1014: 2 => '雷乃発声',
1015: 3 => '玄鳥至',
1016: 4 => '鴻雁北',
1017: 5 => '虹始見',
1018: 6 => '葭始生',
1019: 7 => '霜止出苗',
1020: 8 => '牡丹華',
1021: 9 => '蛙始鳴',
1022: 10 => '蚯蚓出',
1023: 11 => '竹笋生',
1024: 12 => '蚕起食桑',
1025: 13 => '紅花栄',
1026: 14 => '麦秋至',
1027: 15 => '蟷螂生',
1028: 16 => '腐草為蛍',
1029: 17 => '梅子黄',
1030: 18 => '乃東枯',
1031: 19 => '菖蒲華',
1032: 20 => '半夏生',
1033: 21 => '温風至',
1034: 22 => '蓮始開',
1035: 23 => '鷹乃学習',
1036: 24 => '桐始結花',
1037: 25 => '土潤溽暑',
1038: 26 => '大雨時行',
1039: 27 => '涼風至',
1040: 28 => '寒蝉鳴',
1041: 29 => '蒙霧升降',
1042: 30 => '綿柎開',
1043: 31 => '天地始粛',
1044: 32 => '禾乃登',
1045: 33 => '草露白',
1046: 34 => '鶺鴒鳴',
1047: 35 => '玄鳥去',
1048: 36 => '雷乃収声',
1049: 37 => '蟄虫坏戸',
1050: 38 => '水始涸',
1051: 39 => '鴻雁来',
1052: 40 => '菊花開',
1053: 41 => '蟋蟀在戸',
1054: 42 => '霜始降',
1055: 43 => '霎時施',
1056: 44 => '楓蔦黄',
1057: 45 => '山茶始開',
1058: 46 => '地始凍',
1059: 47 => '金盞香',
1060: 48 => '虹蔵不見',
1061: 49 => '朔風払葉',
1062: 50 => '橘始黄',
1063: 51 => '閉塞成冬',
1064: 52 => '熊蟄穴',
1065: 53 => '鱖魚群',
1066: 54 => '乃東生',
1067: 55 => '麋角解',
1068: 56 => '雪下出麦',
1069: 57 => '芹乃栄',
1070: 58 => '水泉動',
1071: 59 => '雉始雊',
1072: 60 => '款冬華',
1073: 61 => '水沢腹堅',
1074: 62 => '鶏始乳',
1075: 63 => '東風解凍',
1076: 64 => '黄鶯睍睆',
1077: 65 => '魚上氷',
1078: 66 => '土脉潤起',
1079: 67 => '霞始靆',
1080: 68 => '草木萌動',
1081: 69 => '蟄虫啓戸',
1082: 70 => '桃始笑',
1083: 71 => '菜虫化蝶'
1084: );
1085:
1086: //太陽黄経
1087: $l1 = $this->longitude_sun($year, $month, $day, 0, 0, 0);
1088: $l2 = $this->longitude_sun($year, $month, $day, 24, 0, 0);
1089:
1090: $n1 = floor($l1 / 5.0);
1091: $n2 = floor($l2 / 5.0);
1092:
1093: return ($n1 != $n2) ? $table[$n2] : '';
1094: }
解説:節分かどうか
1096: /**
1097: * 指定した年月日が節分(立春の前日)かどうかを求める.
1098: * 参考サイト https://www.pahoo.org/e-soul/webtech/php02/php02-42-01.shtm#php_isSetsubun
1099: * @param int $year, $month, $day グレゴリオ暦による年月日
1100: * @return bool TRUE:節分/FALSE:節分ではない
1101: */
1102: function isSetsubun($year, $month, $day) {
1103: //太陽黄経
1104: $l1 = $this->longitude_sun($year, $month, $day, +24, 0, 0);
1105: $l2 = $this->longitude_sun($year, $month, $day, +48, 0, 0);
1106:
1107: $n1 = floor($l1 / 15.0);
1108: $n2 = floor($l2 / 15.0);
1109:
1110: //翌日が立春かどうか
1111: return (($n1 != $n2) && ($n2 == 21)) ? TRUE : FALSE;
1112: }
活用例
参考サイト
- こよみ用語解説 二十四節気:国立天文台暦計算室
- 暦Wiki 七十二候:国立天文台暦計算室
- CalcLongitudeSun:GitHub
- Ruby - 太陽黄経計算!:mk-mode BLOG
- PHPで3ヶ月カレンダーを作る:ぱふぅ家のホームページ
- PHPで日出没・月出没・月齢・潮を計算:ぱふぅ家のホームページ
- 二十四節気・七十二候を計算する:みんなの知識 ちょっと便利帳
- 暑中見舞い・残暑見舞いを送る時期は?:みんなの知識 ちょっと便利帳
- 指定した年の節分を調べる:みんなの知識 ちょっと便利
(2023年2月11日)getSolarTerm72() 表記改訂:水澤腹堅→水沢腹堅。節分の月日表記の不具合修正。
(2023年2月4日)表記改訂:七十二候
(2023年1月14日)計算精度を向上した。数値入力にSpinner、pahooInputDataを導入した。