六曜付カレンダーを作る 其壱

2007.04.17 Author: Jas

4月初めに入社し、開発部の新入社員として研修を始めたわけですが、基本構文を勉強した後にいくつかの課題をやりながらPHPの勉強を進めていっています。

先週の課題はカレンダー作成でした。
土日祝日までうまく表示できるようになり、完成!と思ったのもつかの間・・・
「じゃぁ、今度は六曜も表示させてね」という部長さんの一言で私のカレンダー製作は難関に。

まず、六曜とはなにかというと、「先勝・友引・先負・仏滅・大安・赤口」の6つのことです。
時々カレンダーの隅に書いてあるアレです。
新暦(太陽暦:グレゴリオ暦)のカレンダーで六曜をみると突然途切れたり、同じ日の六曜が年や月によって異なっていたりして、不思議な感じがするのですが・・・
旧暦(太陰太陽暦)では、先勝→友引→先負→仏滅→大安→赤口の順で繰り返しているだけ。
六曜は今の七曜(月・火・水・木・金・土・日)のようなものだったのですね。

旧暦カレンダーでは六曜の決め方は簡単です。
旧暦一日の六曜が、1・7月では先勝、2・8月では友引、3・9月では先負、4・10月では仏滅、5・11月では大安、6・12月では赤口と決まっていて、あとは月末まで順番通り。
そのため、下の表のように、月と日をたした数を6で割ったあまりによって六曜を決定することができます。

(旧暦の月+旧暦の日)÷6=?…あまり
あまり 0
大安
1
赤口
2
先勝
3
友引
4
先負
5
仏滅

では、どうしてこれが難関なのかというと!?

問題なのは旧暦の計算だったのです。

旧暦では月の動きに合わせて一カ月が決められるのですが、月の公転周期は29.53日。
⇒12囘繰返しても354.36日(<地球の公転周期365.2422日)
なので、1年で10.88日も足りません。
このずれは3年で約1か月となるので、約3年に1回(正確には19年7回)閏月を挿入して、ずれを解消しています。
しかし、閏月を挿入する場所が、「4年に1回2月は29日にする」というような固定のルールではなく、暦と季節がずれてきたら閏月を挿入するという変動的なルールになっています。
(閏月挿入箇所決定の問題)

1年分の旧暦計算に必要なものは・・・
前年の冬至から次の年の雨水(2/20頃)までの新月と二十四節気の日付のデータだけです。
が、新月と二十四節気の計算方法が複雑なのも旧暦計算の問題点です。

旧暦の一日は新月の日なので、新月の時刻計算が必要です。
(太陽の位置 = 月の位置)になるときが新月なのですが・・・
月と太陽の位置の計算は略式を利用しても太陽で18個、月で63個のcos関数の総和。
そのため、1回の新月の日時を計算するだけでも時間がかかります。

二十四節気は暦と季節とのずれを検出するために利用されています。
二十四節気とは二分二至(春分・秋分・夏至・冬至)や大寒、立春など24のこよみのことです。
この二十四節気をの計算方法には二種類あります。

    1.年間を等分(時間分割)して計算する「平気法」
    2.実際の太陽の位置から天球上の太陽の軌道を24等分(空間分割)して求める「定気法」

「定気法」では、二十四節気の日付が毎年異なります。
六曜の決定に用いる旧暦では、「定気法」によって二十四節気を決めているので、閏月の挿入箇所の決め方がかなり複雑になっているのです。


次回は、旧暦計算プログラムの内容について紹介します。

名古屋のWebシステム開発・ネットワーク構築会社 コネクティボへ