Rubyで暦注(六曜,九星,干支,中段,宿)を出力

上戸彩 2010年 カレンダー

はじめに

ここヒトツキほど,Googleカレンダーにアイコンを表示するのに恋っていました.九星や十二直などの暦注をアイコンで表示する公開カレンダーです.

数年分のアイコンを手作業で登録すのは無理です.そこでプログラムにより,Googleが拡張したiCalendar形式のファイルを自動生成しています.プログラミングをしたことで暦注について勉強できたので,参考になればと紹介をします.

どうやって暦を計算するか

暦の計算法はこのサイトを見ています.プログラムはRubyで書いています.
暦注計算 - こよみのページ


十干,十二支,二十八宿は「不断」(単純な繰り返し)ですので,プログラムは極めて簡単.ユリウス通日に対して特定の数字の剰余を計算すればOK.Rubyには組み込みクラスDateにユリウス通日を出力するメソッドmjdがあります.

require "date"

class Date
#十二支
def junishi
junishi = ["寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥", "子", "丑"]
return junishi[self.mjd%12]
end

#十干
def jikkan
jikkan = ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"] return jikkan[self.mjd%10]
end

#二十八宿 def nijuhasshuku
nijuhasshuku = ["角", "亢", "氏", "房", "心", "尾", "箕", "斗", "牛", "女", "虚", "危", "室", "壁", "奎", "婁", "胃", "昴", "畢", "觜", "参", "井", "鬼", "柳", "星", "張", "翼", "軫"] return nijuhasshuku[(self.mjd-8)%28]
end
end

相武紗季 2007年 カレンダー
問題は不断ではない暦です.
特に難しいのは九星です.九星は夏至冬至の付近で昇順と降順とが切り替わりますが,その日は干支によって決まります.さらに九星の閏も発生します.その他に,二十七宿は旧暦によって,十二直は太陽の位置で決まる節月によって決定されます.

よってこれらの暦を求めるには,旧暦と節気をも知らなくてはいけません.

  • 旧暦は自力で求めることはせず,高野氏によるのAWKによるライブラリを利用しています.年月日を指定すると,旧暦と六曜を教えてくれます.

 ⇒ Vector:QRSAMP 旧暦計算サンプルスクリプト

  • 節気は次の略算式を参考にしています.将来ずっとこの計算式が成立するわけではありませんが,2050年まではこれで大丈夫だそうです.

 ⇒ 二十四節気の略算式 - AddinBox


プログラムが複雑でわかりにくいので,ここに掲載するのはやめておきます.興味がある人はサンプルをダウンロードしてください.


Rubyで暦注を出力するサンプルプログラム

こちらからファイルをダウンロードできます.BSDライセンスを適用します.このサンプルプログラムは旧暦と六曜の出力に高野氏のスクリプトを利用しています.またGAWKをインストールしていない場合は各自でダウンロードしてください.

Dateクラスを拡張しており,六曜,九星,十干,十二支,十二直,二十七宿,二十八宿が出力できます.

ぜひ感想を頂けると今後のモチベーションを持てるのでよろしくお願いします.

※このサンプルプログラムは完全な動作確認をしてません.複数の日付を選んで確認をとったのみです.また21世紀後半以降については確実に誤りが発生します.このサンプルを信用せず,あくまで参考程度にしてください.