PHPで二十四節気・七十二候一覧を作成

(1/1)
二十四節気 (にじゅうしせっき) とは、立春、大暑、小雪など、節分を基準に 1 年を 24等分して約 15 日ごとに分けた季節のことである。1 年の太陽の黄道上の動きを視黄経の 15 度ごとに 24等分して決められている。
二十四節気を更に 5 日おきに分けて、気象の動きや動植物の変化を知らせるようにしたのが七十二候 (しちゅじゅうひこう) である。
ちなみに「気候」という言葉は、「節気」と「候」に由来する。

今回は、PHP で視黄経を算出するプログラムを作り、指定した年の二十四節気と七十二候の一覧を求めることを目標にする。

(2019 年 2 月 9 日)pahooCalendar::makeLunarCalendar の不具合を修正、getSolarTerm72 の漢字表記を変更した。

目次

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

PHPで二十四節気・七十二候一覧を作成

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

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

解説:pahooCalendarクラス

0030: //暦計算クラス
0031: require_once('pahooCalendar.php');

0161: //pahooCalendarクラス
0162: $pcl = new pahooCalendar();
0163: $pcl->setLanguage('jp');

太陽黄経の計算や、二十四節気・七十二候の計算はユーザークラス "pahooCalendar" に分離している。
まず、クラスファイル "pahooCalendar.php" を  require_once  し、オブジェクトを生成する。

解説:視黄経の算出

0463: /**
0464:  * 太陽の黄経計算(視黄経)
0465:  * @param double $jy 2000.0からの経過年数
0466:  * @return double 太陽の黄経(視黄経)
0467: */
0468: function __longitude_sun($jy) {
0469:     $th  = 0.0003 * sin(deg2rad($this->__angle(329.7  +   44.43  * $jy)));
0470:     $th += 0.0003 * sin(deg2rad($this->__angle(352.5  + 1079.97  * $jy)));
0471:     $th += 0.0004 * sin(deg2rad($this->__angle( 21.1  +  720.02  * $jy)));
0472:     $th += 0.0004 * sin(deg2rad($this->__angle(157.3  +  299.30  * $jy)));
0473:     $th += 0.0004 * sin(deg2rad($this->__angle(234.9  +  315.56  * $jy)));
0474:     $th += 0.0005 * sin(deg2rad($this->__angle(291.2  +   22.81  * $jy)));
0475:     $th += 0.0005 * sin(deg2rad($this->__angle(207.4  +    1.50  * $jy)));
0476:     $th += 0.0006 * sin(deg2rad($this->__angle( 29.8  +  337.18  * $jy)));
0477:     $th += 0.0007 * sin(deg2rad($this->__angle(206.8  +   30.35  * $jy)));
0478:     $th += 0.0007 * sin(deg2rad($this->__angle(153.3  +   90.38  * $jy)));
0479:     $th += 0.0008 * sin(deg2rad($this->__angle(132.5  +  659.29  * $jy)));
0480:     $th += 0.0013 * sin(deg2rad($this->__angle( 81.4  +  225.18  * $jy)));
0481:     $th += 0.0015 * sin(deg2rad($this->__angle(343.2  +  450.37  * $jy)));
0482:     $th += 0.0018 * sin(deg2rad($this->__angle(251.3  +    0.20  * $jy)));
0483:     $th += 0.0018 * sin(deg2rad($this->__angle(297.8  + 4452.67  * $jy)));
0484:     $th += 0.0020 * sin(deg2rad($this->__angle(247.1  +  329.64  * $jy)));
0485:     $th += 0.0048 * sin(deg2rad($this->__angle(234.95 +   19.341 * $jy)));
0486:     $th += 0.0200 * sin(deg2rad($this->__angle(355.05 +  719.981 * $jy)));
0487:     $th += (1.9146 - 0.00005 * $jy) * sin(deg2rad($this->__angle(357.538 + 359.991 * $jy)));
0488:     $th += $this->__angle(280.4603 + 360.00769 * $jy);
0489: 
0490:     return $this->__angle($th);
0491: }

解説:視黄経の算出

0493: /**
0494:  * 太陽の黄経計算(視黄経)
0495:  * @param int $year, $month, $day  グレゴリオ暦による年月日
0496:  * @param double $hour, $min, $sec 時分秒(世界時)
0497:  * @return double 太陽の黄経(視黄経)
0498: */
0499: function longitude_sun($year$month$day$hour$min$sec) {
0500:     $jy = $this->Gregorian2JY($year$month$day$hour$min$sec);
0501: 
0502:     return $this->__longitude_sun($jy);
0503: }

計算式は『日の出・日の入りの計算』(長沢工=著)による。

解説:二十四節気の算出

0587: /**
0588:  * その日が二十四節気かどうか
0589:  * @param int $year, $month, $day  グレゴリオ暦による年月日
0590:  * @return string 二十四節気/'' :二十四節気ではない
0591: */
0592: function getSolarTerm($year$month$day) {
0593:     static $old = -1.0;
0594:     static $table = array(
0595:   0 => '春分',
0596:   1 => '清明',
0597:   2 => '穀雨',
0598:   3 => '立夏',
0599:   4 => '小満',
0600:   5 => '芒種',
0601:   6 => '夏至',
0602:   7 => '小暑',
0603:   8 => '大暑',
0604:   9 => '立秋',
0605:  10 => '処暑',
0606:  11 => '白露',
0607:  12 => '秋分',
0608:  13 => '寒露',
0609:  14 => '霜降',
0610:  15 => '立冬',
0611:  16 => '小雪',
0612:  17 => '大雪',
0613:  18 => '冬至',
0614:  19 => '小寒',
0615:  20 => '大寒',
0616:  21 => '立春',
0617:  22 => '雨水',
0618:  23 => '啓蟄'
0619: );
0620: 
0621:     //太陽黄経
0622:     $l1 = $this->longitude_sun($year$month$day, 0, 0, 0);
0623:     $l2 = $this->longitude_sun($year$month$day, 24, 0, 0);
0624: 
0625:     $n1 = floor($l1 / 15.0);
0626:     $n2 = floor($l2 / 15.0);
0627: 
0628:     return ($n1 != $n2) ? $table[$n2] : '';
0629: }

年月日から二十四節気を求めるのが、ユーザー関数 getSolarTerm である。
直前の呼ばれた時の二十四節気を static 変数 $old にn保持しておき、そこから視黄経が 15 度以上離れたら、新しい二十四節気を配列 $table から取り出して返す。

解説:七十二候の算出

0631: /**
0632:  * その日が七十二候かどうか
0633:  * @param int $year, $month, $day  グレゴリオ暦による年月日
0634:  * @return string 七十二候/'' :七十二候ではない
0635: */
0636: function getSolarTerm72($year$month$day) {
0637:     static $old = -1.0;
0638:     static $table = array(
0639:  0 => '雀始巣',
0640:  1 => '桜始開',
0641:  2 => '雷乃発声',
0642:  3 => '玄鳥至',
0643:  4 => '鴻雁北',
0644:  5 => '虹始見',
0645:  6 => '葭始生',
0646:  7 => '霜止出苗',
0647:  8 => '牡丹華',
0648:  9 => '鼃始鳴',
0649: 10 => '蚯蚓出',
0650: 11 => '竹笋生',
0651: 12 => '蚕起食桑',
0652: 13 => '紅花栄',
0653: 14 => '麦秋至',
0654: 15 => '蟷螂生',
0655: 16 => '腐草為蛍',
0656: 17 => '梅子黄',
0657: 18 => '乃東枯',
0658: 19 => '菖蒲華',
0659: 20 => '半夏生',
0660: 21 => '温風至',
0661: 22 => '蓮始開',
0662: 23 => '鷹乃学習',
0663: 24 => '桐始結花',
0664: 25 => '土潤溽暑',
0665: 26 => '大雨時行',
0666: 27 => '涼風至',
0667: 28 => '寒蝉鳴',
0668: 29 => '蒙霧升降',
0669: 30 => '綿柎開',
0670: 31 => '天地始粛',
0671: 32 => '禾乃登',
0672: 33 => '草露白',
0673: 34 => '鶺鴒鳴',
0674: 35 => '玄鳥去',
0675: 36 => '雷乃収声',
0676: 37 => '蟄虫坏戸',
0677: 38 => '水始涸',
0678: 39 => '鴻雁来',
0679: 40 => '菊花開',
0680: 41 => '蟋蟀在戸',
0681: 42 => '霜始降',
0682: 43 => '霎時施',
0683: 44 => '楓蔦黄',
0684: 45 => '山茶始開',
0685: 46 => '地始凍',
0686: 47 => '金盞香',
0687: 48 => '虹蔵不見',
0688: 49 => '朔風払葉',
0689: 50 => '橘始黄',
0690: 51 => '閉塞成冬',
0691: 52 => '熊蟄穴',
0692: 53 => '鱖魚群',
0693: 54 => '乃東生',
0694: 55 => '麋角解',
0695: 56 => '雪下出麦',
0696: 57 => '芹乃栄',
0697: 58 => '水泉動',
0698: 59 => '雉始雊',
0699: 60 => '款冬華',
0700: 61 => '水沢腹堅',
0701: 62 => '雞始乳',
0702: 63 => '東風解凍',
0703: 64 => '黄鶯睍睆',
0704: 65 => '魚上氷',
0705: 66 => '土脉潤起',
0706: 67 => '霞始靆',
0707: 68 => '草木萠動',
0708: 69 => '蟄虫啓戸',
0709: 70 => '桃始笑',
0710: 71 => '菜虫化蝶'
0711: );
0712: 
0713:     //太陽黄経
0714:     $l1 = $this->longitude_sun($year$month$day, 0, 0, 0);
0715:     $l2 = $this->longitude_sun($year$month$day, 24, 0, 0);
0716: 
0717:     $n1 = floor($l1 / 5.0);
0718:     $n2 = floor($l2 / 5.0);
0719: 
0720:     return ($n1 != $n2) ? $table[$n2] : '';
0721: }

同様に、年月日から七十二候を求めるのが、ユーザー関数 getSolarTerm72 である。

活用例

みんなの知識 ちょっと便利帳では、「二十四節気・七十二候を計算する」「暑中見舞い・残暑見舞いを送る時期は?」のコーナーで、このサンプル・プログラムを活用している。ありがとうございます。

参考書籍

表紙 日の出・日の入りの計算
著者 長沢工
出版社 地人書館
サイズ 単行本
発売日 1999年12月
価格 1,650円(税込)
rakuten
ISBN 9784805206348
 

参考サイト

(この項おわり)
header