漢の文帝の“改暦”(続き)

2012-08-21の「漢の文帝の“改暦”」の記事のフォローアップです。

大分前から実装済みの When::CalendarTypess::ChineseTwin::顓頊暦は
銀雀山漢簡の時代の置閏に一致したもので、紀元前162年以降は実際の
置閏とずれます。

実際の暦は、紀元前162年より前は冬至が11月になるように閏が配置
されていましたが、紀元前162年以降は雨水が1月になるように変わっ
ているのです。[1]

When::CalendarTypess::ChineseLuniSolar は、内部変数 @base_month
を 11 から 1 に変えるだけで済むように設計しましたが、いつでも
できる…ということで、実装が先延ばしになっていました。

今回、ようやく残暦法のひとつとして実装を済ませました。[2]

 require 'when_exe'
 require 'when_exe/region/chinese/calendars'
 include When
 def verify(calendar, range)
  cdate = when?("#{range.first}-1-1^^ChineseTwin::#{calendar}")
  while range.include?(cdate.year)
   tdate = When::Chinese_221 ^ cdate
   p [cdate, tdate] unless cdate.cal_date[1..2] == tdate.cal_date[1..2]
   cdate += P1M
  end
 end

 verify('顓頊暦',   -202..-162) # => 出力(=差分)なし
 verify('顓頊暦後期', -161..-104) # => 出力(=差分)なし

以前に江戸暦のバリエーションに名前を付けた際、施行された年の干支
を名前に付けたのですが、顓頊暦の時代は、いわゆる顓頊暦紀年法を
考慮せねばならず年の干支では混乱の危険があると考え、紀元前162年
以降の部分を計算する暦法名には「顓頊暦後期」を使いました。

[1] 当時、雨水と1月を対応付けるという意図があったのか、結果的に
  たまたまそうなったのかは、判断を保留すべきでしょう。
[2] ソースコードはこちら
  例によってライブラリでの提供は次のバージョンアップ時です。

この記事へのコメント

この記事へのトラックバック