カレンダーを作る際、閏(うるう)年の判定プログラムはよく話題に挙げられます。
年が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で書いています)
1 2 3 |
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 } ]; |
あとは以下のような日付を計算する関数を作り、各引数を変えて使うだけです。
1 2 3 4 5 |
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を使用する)
1 2 3 4 5 6 7 8 9 10 11 |
/* 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の各行をクリックすると各節気の暦便覧も見れます。
これ以外にも、土用や節分などの雑節もあります。
さらに六曜や干支なども考慮すると、まともな暦を作るのは結構たいへんそうですね;;