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クラス

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

0124: //pahooCalendarクラス
0125: $pcl = new pahooCalendar();
0126: $pcl->setLanguage('jp');

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

解説:視黄経の算出

0428:  * @return double 時角の差
0429: */
0430: function hour_ang_dif($mode$alpha$delta$latitude$height$sidereal) {
0431:     //南中の場合は天体の時角を返す
0432:     if ($mode == 2) {
0433:         $tk = 0;
0434:     } else {
0435:         $tk  = sin(deg2rad($height));
0436:         $tk -= sin(deg2rad($delta)) * sin(deg2rad($latitude));
0437:         $tk /= cos(deg2rad($delta)) * cos(deg2rad($latitude));
0438:         //出没点の時角
0439:         $tk  = rad2deg(acos($tk));
0440:         //$tkは出のときマイナス、入のときプラス
0441:         if ($mode == 0 && $tk > 0)  $tk = -$tk;
0442:         if ($mode == 1 && $tk < 0)  $tk = -$tk;
0443:     }
0444:     //天体の時角
0445:     $t = $sidereal - $alpha;
0446:     $dt = $tk - $t;
0447:     //$dtの絶対値を180°以下に調整
0448:     if ($dt > 180) {
0449:         while ($dt > 180) {
0450:             $dt -= 360;
0451:         }
0452:     }
0453:     if ($dt < -180) {
0454:         while ($dt < -180) {
0455:             $dt += 360;
0456:         }
0457:     }
0458: 
0459:     return $dt;
0460: }
0461: 
0462: // 太陽の位置計算 =========================================================
0463: /**
0464:  * 太陽の黄経計算(視黄経)
0465:  * @param double $jy 2000.0からの経過年数
0466:  * @return double 太陽の黄経(視黄経)
0467: */
0468: function __longitude_sun($jy) {

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

解説:二十四節気の算出

0552:     //補正値初期値
0553:     $rev = 1.0;
0554: 
0555:     //地平線伏角
0556:     $dip = 0.0353333 * sqrt($height);
0557: 
0558:     while (abs($rev) > $this->CONVERGE) {
0559:         //経過ユリウス年(日)計算
0560:         //( 2000.0(2000年1月1日力学時正午)からの経過年数 (年) )
0561:         $jy = ($day_progress + $time_loop + $rotate_rev) / 365.25;
0562:         //太陽の黄経
0563:         $long_sun = $this->__longitude_sun($jy);
0564:         //太陽の距離
0565:         $dist_sun = $this->__distance_sun($jy);
0566:         //黄道 → 赤道変換
0567:         list($alpha$delta) = $this->__eclip2equat($long_sun, 0, $jy);
0568:         //太陽の視半径
0569:         $r_sun = 0.266994 / $dist_sun;
0570:         //太陽の視差
0571:         $dif_sun = 0.0024428 / $dist_sun;
0572:         //太陽の出入高度
0573:         $height_sun = -1 * $r_sun - $this->ASTRO_REFRACT - $dip + $dif_sun;
0574:         //恒星時
0575:         $sidereal = $this->__sidereal($jy$time_loop$longitude);
0576:         //時角差計算
0577:         $hour_ang_dif = $this->hour_ang_dif($mode$alpha$delta$latitude$height_sun$sidereal);
0578: 
0579:         //仮定時刻に対する補正値
0580:         $rev = $hour_ang_dif / 360.0;
0581:         $time_loop += $rev;
0582:     }
0583: 
0584:     return $time_loop;
0585: }
0586: 
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(

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

解説:七十二候の算出

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: }
0630: 
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 => '金盞香',

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

活用例

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

参考書籍

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

参考サイト

(この項おわり)
header