二十四節気

カレンダーを作る際、閏(うるう)年の判定プログラムはよく話題に挙げられます。
年が100の倍数のときは400で割れる年、100の倍数でないときは4で割り切れる年ってやつですね。

今回はもう少しややこしい二十四節気(にじゅうしせっき)の判定プログラムです。
祝日の春分・秋分を含む二十四節気は、日付が固定されてるわけではなく計算式で求められます。
二十四節気 – Wikipediaによると、
「1太陽年を日数(平気法)あるいは太陽の黄道上の視位置(定気法)によって24等分し、その分割点を含む日に季節を表す名称を付したもの」
とあります。
360度を24で割ると15度。
視太陽黄経が15度の倍数になる瞬間、日常的にはそれを含む「日」を二十四節気とします。
計算式は以下のサイトで説明されています。
二十四節気の略算式
[日] = INT(D + (A × (Y – 1900)) – INT((Y – 1900) ÷ 4))

この二十四節気を求めるプログラム例として、
1月の小寒から12月の冬至までの各パラメータ(dおよびa)の配列(結合配列の配列)を用意します。
(ここではActionScriptで書いています)

private const param:Array = [ { d:6.3811, a:0.242778 }, { d:21.1046, a:0.242765 }, { d:4.8693, a:0.242713 }, { d:19.7062, a:0.242627 }, { d:6.3968, a:0.242512 }, { d:21.4471, a:0.242377 }, { d:5.6280, a:0.242231 }, { d:20.9375, a:0.242083 }, { d:6.3771, a:0.241945 }, { d:21.9300, a:0.241825 }, { d:6.5733, a:0.241731 }, { d:22.2747, a:0.241669 }, { d:8.0091, a:0.241642 }, { d:23.7317, a:0.241654 }, { d:8.4102, a:0.241703 }, { d:24.0125, a:0.241786 }, { d:8.5186, a:0.241898 }, { d:23.8896, a:0.242032 }, { d:9.1414, a:0.242179 }, { d:24.2487, a:0.242328 }, { d:8.2396, a:0.242469 }, { d:23.1189, a:0.242592 }, { d:7.9152, a:0.242689 }, { d:22.6587, a:0.242752 } ];

あとは以下のような日付を計算する関数を作り、各引数を変えて使うだけです。

private function calculateDate(y:int, d:Number, a:Number):int {
  return d + a * (y - 1900) - Math.floor((y - 1900) / 4);    //yは年(西暦)
}

ここで気を付けることは、小寒から雨水までの4つは年(y)から1引いておくことです。
(2008年ならyには2007を使用する)

/* day(Array)に小寒から冬至までの日付を格納, yearは任意の年 */

var day:Array = [];
var len:int = param.length;
var year:int = int(YearInput.text);    //YearInputはmx:TextInput
for (var i:int = 0; i < len; i++) {
  if (i < 4) day.push(calculateDate(year-1, param[i].d, param[i].a));
  else day.push(calculateDate(year, param[i].d, param[i].a));
}

これらを使ってFlexのDataGridに二十四節気を表示させました。
(Flashが表示されてない人はこちらから→season.swf)
フォームに年を西暦で入力してください。(1870?2099年まで, 精度は0.03日程度)
また、DataGridの各行をクリックすると各節気の暦便覧も見れます。

これ以外にも、土用や節分などの雑節もあります。
さらに六曜干支なども考慮すると、まともな暦を作るのは結構たいへんそうですね;;

あわせて読む:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です