# # $Id: chinesedate.rb,v 1.9 2003/02/28 18:26:11 fukumoto Exp $ # # ChineseDate # KAN, KAN_ON, KAN_YOMI # SI, SI_YOMI, SI_ON # KANSI # year_eto # day_eto # most_recent_year # most_recent_day # raise if $KCODE == 'NONE' module ChineseDate KAN = '甲乙丙丁戊己庚辛壬癸' . split(//) . freeze KAN_ON = ['こう', 'おつ', 'へい', 'てい', 'ぼ', 'き', 'こう', 'しん', 'じん', 'き'] . freeze ELEMENTS = ['き', 'ひ', 'つち', 'か', 'みず'] . freeze # 木火土金水 E_TO = ['え', 'と'] . freeze KAN_YOMI = ELEMENTS.map {|i| E_TO.map{|j| i+'の'+j}}.flatten.freeze SI = '子丑寅卯辰巳午未申酉戌亥' . split(//) . freeze SI_ON = ['し', 'ちゅう', 'いん', 'ぼう', 'しん', 'し', 'ご', 'び', 'しん', 'ゆう', 'じゅつ', 'がい'].freeze SI_YOMI = ['ね', 'うし', 'とら', 'う', 'たつ', 'み', 'うま', 'ひつじ', 'さる', 'とり', 'いぬ', 'い'].freeze KANSI = (0..59).map{|i| KAN[i%10] + SI[i%12]}.freeze KANSI_YOMI = (0..59).map{|i| KAN_YOMI[i%10] + SI_YOMI[i%12]}.freeze KANSI_ON = (0..59).map{|i| KAN_ON[i%10] + SI_ON[i%12]}.freeze KANSI_TO_INDEX = Hash.new 60.times do |i| KANSI_TO_INDEX[KANSI[i]] = i end KANSI_TO_INDEX.freeze YOMI_TO_INDEX = Hash.new 60.times do |i| YOMI_TO_INDEX[KANSI_YOMI[i]] = i end YOMI_TO_INDEX.freeze ON_TO_INDICES = Hash.new 60.times do |i| (ON_TO_INDICES[KANSI_ON[i]] ||= Array.new).push(i) end ON_TO_INDICES.freeze # gregorian to eto_index modulo 60. # Note that the definition of the year is different YEAR_OFFSET = 56 # jd to eto_index modulo 60 DAY_OFFSET = 49 class <