もりきゅうです。

Tadayoshi Funaba さんは書きました:
>ちょっとみただけですが、これは旧暦とはいえないと思います。いわゆる旧暦
>は、月の決定がなかなか複雑ですが、このプログラムでは閏月を考慮している
>ふうもなさそうなんですが、どうなんでしょう。

旧暦は
・新月(月齢 0.0)を含む日を 1日とする。
・太陽の位置で決まる節気で月を決める。
という規則です。たしかに天保の改暦以降は月の決定が 3か月区切りで行われる
ので,任意の新暦から旧暦を得るのは難しいです。カレンダーを作るようにすれ
ば比較的簡単になると思われます。

閏月は必然的に決まりますので,月齢が正しく計算されていれば問題ありません。
ただし「閏」という字を付ける必要はありますね。^^;

例えば 1998 年は 閏5月 があります。
新暦 6/24 が 旧暦 閏5/1 になるはず。で,やってみると..
ありゃ,6/1 になりますね。
新暦 7/23 が 旧暦 6/1 になるはず。で,やってみると..
ちゃんと 6/1 になります。ということは 閏6月 となってしまっているわけだ。

旧暦の日付を計算する Ephem::lunar_mday の精度がいまいちなので,こういう
事態が生じています。

月齢を Fixnum::to_i で切り捨てて旧暦の日を得るわけですが 0.99 と 1.00
などの境界にあたる数値では+1日の誤差が生じてしまう。なので,前日・翌日
の月齢も計算して判断しています。この辺りのロジックをもっと正確に組まな
いといけないですね。
やっぱり,カレンダーを作る形式にしようかな。

>あと、lunar calendar というと、太陰暦のことのようだから、月についての
>暦、くらいのつもりなら、almanac がよいかも。旧暦についていうなら、太陰
>太陽暦ですから、luni-solar calendar の一種ということになりますが。

ああ,そのとおりです。almanac にします。
# 日付は月齢に基づき,月は黄道に基づく。

ありがとうございました。

----
Kazuhiro Yoshida  moriq.kazuhiro / nifty.ne.jp