├── liuren.rb ├── README.md ├── bazi.rb ├── qimen.rb ├── cdate.rb ├── ziwei.rb └── goleph.rb /liuren.rb: -------------------------------------------------------------------------------- 1 | #encoding: utf-8 2 | 3 | 4 | 5 | require_relative 'cdate' 6 | require_relative 'goleph.rb' 7 | require 'time' 8 | 9 | 10 | def main( ) 11 | 12 | v = {} 13 | v["天干"] = [ "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸" ] 14 | v["地支"] = [ "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"] 15 | v["贵神"] = [ "贵", "腾", "朱", "六", "勾", "青", "空", "白", "常", "玄", "阴", "后"] 16 | 17 | o = {} 18 | o["月将"] = [ 1, 0 , 11, 10, 9 , 8 ,7 ,6, 5, 4, 3, 2 ] 19 | o["贵神昼"] = [ 1, 0, 11,11, 1,0, 1,6,5,5 ] 20 | o["贵神夜"] = [ 7, 8, 9, 9, 7,8, 7,2,3,3 ] 21 | o["人元"] = [ 0, 2,4 ,6 ,8 , 0,2 ,4 ,6 ,8 ] 22 | 23 | if ( ARGV.length < 2 ) 24 | puts "Usage " 25 | return 26 | end 27 | 28 | 29 | nongli = CDate.new() 30 | 31 | 32 | #起四柱 33 | sizhu = nongli.bazi( DateTime.parse( ARGV[0] ) ) 34 | (0...4).each { |i| 35 | puts "#{v["天干"][sizhu[i][0]]}#{v["地支"][sizhu[i][1]]}" 36 | } 37 | 38 | #起地分 39 | difen = ARGV[1].to_i 40 | print "地分:",v["地支"][difen],"\n" 41 | 42 | 43 | #起月将 44 | yuejiang_o = o["月将"][ sizhu[1][1] ] 45 | print "月将:",v["地支"][ yuejiang_o ],"\n" 46 | 47 | #起将神 48 | jiangshen = ( difen + yuejiang_o - sizhu[3][1] ) % 12 49 | print "将神:",v["地支"][ jiangshen ],"\n" 50 | 51 | 52 | #起贵神 53 | guishen_o = o["贵神昼"][ sizhu[2][0] ] 54 | guishen = (difen - guishen_o) % 12 55 | print "贵神:",v["贵神"][ guishen ],"\n" 56 | 57 | 58 | #起人元 59 | renyuan = o["人元"][ sizhu[2][0] ] 60 | print "人元:",v["天干"][ (difen + renyuan) % 10 ],"\n" 61 | 62 | #将干 63 | print "将干:",v["天干"][ (jiangshen + renyuan) % 10 ],"\n" 64 | 65 | 66 | #神干 67 | print "神干:",v["天干"][ (difen + renyuan) % 10 ],"\n" 68 | 69 | end 70 | 71 | main 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 玄学基础研究 5 | 6 | 玄学研究编程应用 7 | 8 | 9 | 八字 10 | ---- 11 | 12 | Usage: ruby bazi.rb <出生日期> <性别 m|f> 13 | Example: ruby bazi.rb "1985/12/21 12:24" 14 | Sample output: 15 | 16 | 17 | 本命 | 大 流 流 流 | 流 流 18 | 年 月 日 时 | 运 年 月 日 | 时 分 19 | -------------------------------------------------- 20 | 伤 才 日 杀 | 伤 官 食 杀 | 财 枭 21 | 乙 戊 甲 庚 | 乙 己 丙 庚 | 丁 辛 22 | 丑 子 午 午 | 酉 亥 子 子 | 亥 丑 23 | 官 印 食 食 | 枭 劫 印 印 | 劫 官 24 | ------------------------------------------ 25 | 26 | 27 | 大运 28 | 1991 2001 2011 2021 2031 2041 2051 2061 29 | 丁 丙 乙 甲 癸 壬 辛 庚 30 | 亥 戌 酉 申 未 午 巳 辰 31 | 32 | 33 | 34 | 35 | 36 | 37 | 紫微斗数 38 | ------- 39 | 40 | Usage: ruby ziwei.rb <出生日期> [<流日日期> <性别 m|f>] 41 | Example: ruby ziwei.rb "1988/07/25 16:40" 42 | 43 | Sample output: 44 | 45 | 阳男 46 | 26岁 47 | 水二局 48 | 命宫:亥 49 | 身宫:卯 50 | 51 | 52 | 先天盘 53 | 六月 十二 54 | 戊辰 己未 辛巳 丙申 55 | 56 | 甲子 父母 帝旺 12-21 巨门平 文曲旺 截路 解神 恩光 57 | 乙丑 福德 衰 22-31 天魁 破碎 天相平 空亡 天德 寡宿 58 | 甲寅 田宅 病 32-41 文昌陷 天同旺 天哭 天马 台辅 天刑平 天梁平 59 | 乙卯 官禄 死 42-51 天官 地空 七杀平 天月 天才 武曲旺 天福 60 | 丙辰 仆役 墓 52-61 太阳平 天殇 陀螺平 阴煞 华盖 61 | 丁巳 迁移 绝 62-71 天空 孤辰 右弼(科) 天喜 禄存平 62 | 戊午 疾厄 胎 72-81 年解 凤阁 八座 天厨 天使 擎羊陷 蜚廉 铃星平 天机平(忌) 天姚旺 63 | 己未 财帛 养 82-91 地劫 天钺 紫微平 破军平 天寿 64 | 庚申 子女 长生 92-101 龙池 天巫 三台 65 | 辛酉 夫妻 沐浴 102-111 天府平 左辅 咸池 66 | 壬戌 兄弟 冠带 112-121 天虚 火星平 旬空 封诰 天贵 太阴平(权) 67 | 癸亥 命宫 临官 2-11 大耗 贪狼陷(禄) 廉贞陷 红鸳 68 | 69 | 70 | 大限盘 71 | 二月 十三 72 | 癸巳 乙卯 己丑 庚午 73 | 74 | 甲子 兄弟 巨门平 文曲旺 截路 解神 恩光 75 | 乙丑 命宫 天魁 破碎 天相平 空亡 天德 寡宿 76 | 甲寅 父母 文昌陷 天同旺 天哭 天马 台辅 天刑平 天梁平(权) 77 | 乙卯 福德 天官 地空 七杀平 天月 天才 武曲旺 天福 78 | 丙辰 田宅 太阳平 天殇 陀螺平 阴煞 华盖 79 | 丁巳 官禄 天空 孤辰 右弼 天喜 禄存平 80 | 戊午 仆役 年解 凤阁 八座 天厨 天使 擎羊陷 蜚廉 铃星平 天机平(禄) 天姚旺 81 | 己未 迁移 地劫 天钺 紫微平(科) 破军平 天寿 82 | 庚申 疾厄 龙池 天巫 三台 83 | 辛酉 财帛 天府平 左辅 咸池 84 | 壬戌 子女 天虚 火星平 旬空 封诰 天贵 太阴平(忌) 85 | 癸亥 夫妻 大耗 贪狼陷 廉贞陷 红鸳 86 | 87 | 88 | 流年盘 89 | 二月 十三 90 | 癸巳 乙卯 己丑 庚午 91 | 92 | 甲子 疾厄 巨门平(权) 文曲旺 截路 解神 恩光 93 | 乙丑 财帛 天魁 破碎 天相平 空亡 天德 寡宿 94 | 甲寅 子女 文昌陷 天同旺 天哭 天马 台辅 天刑平 天梁平 95 | 乙卯 夫妻 天官 地空 七杀平 天月 天才 武曲旺 天福 96 | 丙辰 兄弟 太阳平 天殇 陀螺平 阴煞 华盖 97 | 丁巳 命宫 天空 孤辰 右弼 天喜 禄存平 98 | 戊午 父母 年解 凤阁 八座 天厨 天使 擎羊陷 蜚廉 铃星平 天机平 天姚旺 99 | 己未 福德 地劫 天钺 紫微平 破军平(禄) 天寿 100 | 庚申 田宅 龙池 天巫 三台 101 | 辛酉 官禄 天府平 左辅 咸池 102 | 壬戌 仆役 天虚 火星平 旬空 封诰 天贵 太阴平(科) 103 | 癸亥 迁移 大耗 贪狼陷(忌) 廉贞陷 红鸳 104 | 105 | 106 | 流月盘 107 | 二月 十三 108 | 癸巳 乙卯 己丑 庚午 109 | 110 | 甲子 田宅 巨门平 文曲旺 截路 解神 恩光 111 | 乙丑 官禄 天魁 破碎 天相平 空亡 天德 寡宿 112 | 甲寅 仆役 文昌陷 天同旺 天哭 天马 台辅 天刑平 天梁平(权) 113 | 乙卯 迁移 天官 地空 七杀平 天月 天才 武曲旺 天福 114 | 丙辰 疾厄 太阳平 天殇 陀螺平 阴煞 华盖 115 | 丁巳 财帛 天空 孤辰 右弼 天喜 禄存平 116 | 戊午 子女 年解 凤阁 八座 天厨 天使 擎羊陷 蜚廉 铃星平 天机平(禄) 天姚旺 117 | 己未 夫妻 地劫 天钺 紫微平(科) 破军平 天寿 118 | 庚申 兄弟 龙池 天巫 三台 119 | 辛酉 命宫 天府平 左辅 咸池 120 | 壬戌 父母 天虚 火星平 旬空 封诰 天贵 太阴平(忌) 121 | 癸亥 福德 大耗 贪狼陷 廉贞陷 红鸳 122 | 123 | 124 | 流日盘 125 | 二月 十三 126 | 癸巳 乙卯 己丑 庚午 127 | 128 | 甲子 田宅 巨门平 文曲旺(忌) 截路 流禄 解神 恩光 129 | 乙丑 官禄 天魁 流羊 破碎 天相平 空亡 天德 寡宿 130 | 甲寅 仆役 文昌陷 天同旺 天哭 天马 台辅 天刑平 天梁平(科) 131 | 乙卯 迁移 天官 地空 七杀平 天月 天才 武曲旺(禄) 流魁 天福 132 | 丙辰 疾厄 太阳平 天殇 陀螺平 阴煞 流喜 华盖 133 | 丁巳 财帛 天空 流钺 孤辰 右弼 天喜 流昌 禄存平 134 | 戊午 子女 年解 凤阁 八座 天厨 天使 擎羊陷 蜚廉 铃星平 天机平 天姚旺 135 | 己未 夫妻 地劫 天钺 紫微平 破军平 天寿 136 | 庚申 兄弟 龙池 天巫 三台 137 | 辛酉 命宫 流曲 天府平 左辅 咸池 138 | 壬戌 父母 天虚 火星平 旬空 封诰 天贵 流鸳 太阴平 139 | 癸亥 福德 流陀 大耗 贪狼陷(权) 廉贞陷 红鸳 140 | 141 | 142 | 流时盘 143 | 二月 十三 144 | 癸巳 乙卯 己丑 庚午 145 | 146 | 甲子 子女 巨门平 文曲旺 截路 流禄 解神 恩光 147 | 乙丑 夫妻 天魁 流羊 破碎 天相平 空亡 天德 寡宿 148 | 甲寅 兄弟 文昌陷 天同旺(忌) 天哭 天马 台辅 天刑平 天梁平 149 | 乙卯 命宫 天官 地空 七杀平 天月 天才 武曲旺(权) 流魁 天福 150 | 丙辰 父母 太阳平(禄) 天殇 陀螺平 阴煞 流喜 华盖 151 | 丁巳 福德 天空 流钺 孤辰 右弼 天喜 流昌 禄存平 152 | 戊午 田宅 年解 凤阁 八座 天厨 天使 擎羊陷 蜚廉 铃星平 天机平 天姚旺 153 | 己未 官禄 地劫 天钺 紫微平 破军平 天寿 154 | 庚申 仆役 龙池 天巫 三台 155 | 辛酉 迁移 流曲 天府平(科) 左辅 咸池 156 | 壬戌 疾厄 天虚 火星平 旬空 封诰 天贵 流鸳 太阴平 157 | 癸亥 财帛 流陀 大耗 贪狼陷 廉贞陷 红鸳 158 | 159 | 160 | 大六壬 金口诀 161 | ---- 162 | 163 | Usage: ruby liuren.rb <时间> <地分> 164 | Example: ruby liuren.rb "2012/12/23 22:25" 4 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | -------------------------------------------------------------------------------- /bazi.rb: -------------------------------------------------------------------------------- 1 | #encoding: utf-8 2 | 3 | 4 | 5 | require_relative 'cdate' 6 | require_relative 'goleph.rb' 7 | require 'time' 8 | 9 | def main() 10 | 11 | v = {} 12 | 13 | # 0 1 2 3 4 5 6 7 8 9 14 | v["天干"] = [ "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸" ] 15 | v["地支"] = [ "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"] 16 | v["贵神"] = [ "贵", "腾", "朱", "六", "勾", "青", "空", "白", "常", "玄", "阴", "后"] 17 | v["十神"] = [ "比", "劫", "食", "伤", "才", "财", "杀", "官" , "印", "枭" ] 18 | 19 | 20 | # 0 1 2 3 4 5 6 7 8 9 21 | v["五行"] = ["阳木","阴木","阳火","阴火","阳土","阴土","阳金","阴金","阳水","阴水"] 22 | 23 | v["干五行"] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] 24 | v["支五行"] = [ 8, 5, 0, 1, 4, 3, 2, 5, 6, 7, 4, 9] 25 | 26 | v["支藏干"] = [ 27 | [9], 28 | [5,9,7], 29 | [0,2,4], 30 | [1], 31 | [4,1,9], 32 | [2,6,4], 33 | [3,5], 34 | [5,3,1], 35 | [6,8,4], 36 | [7], 37 | [4,7,3], 38 | [8,0] 39 | ] 40 | 41 | v["干阴阳"] = [ 1, -1, 1 , -1, 1, -1, 1, -1, 1, -1 ] 42 | v["支阴阳"] = [ 1, -1, 1 , -1, 1, -1, 1, -1, 1, -1 , 1 , -1 ] 43 | 44 | v["推干法"] = [ 0, 2, 4 , 6, 8, 0, 2, 4, 6, 8 ] 45 | v["节气"] = ['冬至','小寒','大寒','立春','雨水','惊蛰','春分','清明','谷雨','立夏','小满','芒种','夏至','小暑','大暑','立秋','处暑','白露','秋分','寒露','霜降','立冬','小雪','大雪'] 46 | 47 | 48 | if ARGV.length < 1 49 | puts "Usage: ruby bazi.rb []" 50 | return 51 | end 52 | 53 | nongli = CDate.new() 54 | 55 | birthdate = DateTime.parse( ARGV[0] ) 56 | sizhu = nongli.bazi( birthdate ) 57 | gender = ARGV[1] ? ARGV[1] == "f" ? -1 : 1 : 1 58 | 59 | 60 | rizhu = sizhu[2][0] 61 | 62 | # 顺推或逆推根据 年干 * 性别 , shun = 1 , ni = -1 63 | shun_or_ni = gender * v["干阴阳"][ sizhu[0][0] ] 64 | 65 | # 计算几时起运, 不能算中气 66 | birthdate_jieqi = nongli.to_ccal2(birthdate)[:term] 67 | birthdate_jieqi_index = (v["节气"].index(birthdate_jieqi) + 1) / 2 68 | 69 | 70 | jieqi = birthdate_jieqi 71 | 72 | d_to_jieqi_change = 0 73 | h_to_jieqi_change = 0 74 | 75 | (1..30).each { |i_d| 76 | jieqi = nongli.to_ccal2(birthdate + i_d * shun_or_ni )[:term] 77 | jieqi_index = ( v["节气"].index(jieqi) + 1 ) / 2 78 | d_to_jieqi_change += shun_or_ni 79 | if jieqi_index != birthdate_jieqi_index 80 | break 81 | end 82 | } 83 | 84 | (1..24).each { |i_h| 85 | jieqi = nongli.to_ccal2( (birthdate + d_to_jieqi_change - shun_or_ni ) + i_h / 24.0 * shun_or_ni )[:term] 86 | jieqi_index = ( v["节气"].index(jieqi) + 1 ) / 2 87 | h_to_jieqi_change += shun_or_ni 88 | if jieqi_index != birthdate_jieqi_index 89 | break 90 | end 91 | } 92 | 93 | 94 | #qiyundate = birthdate >> ( d_to_jieqi_change / 3 ) * 12 95 | #qiyundate = qiyundate >> ( d_to_jieqi_change % 3 ) * 4 96 | qiyundate = birthdate + (( (d_to_jieqi_change.abs - 1 ) * 24 ) + h_to_jieqi_change.abs + 11 ) * 5 97 | 98 | 99 | 100 | 101 | qiyunyear = qiyundate.year 102 | if qiyundate.month >= 7 103 | qiyunyear += 1 104 | end 105 | 106 | current_date = DateTime.now() 107 | current_sizhu = nongli.bazi( current_date ) 108 | 109 | 110 | puts "生日: #{ birthdate }" 111 | puts "生日节气: #{ birthdate_jieqi }" 112 | puts "起运: #{ qiyundate }" 113 | puts "当下: #{ current_date }" 114 | 115 | 116 | 117 | yun_cycle = ( current_date.year - qiyunyear ) / 10 + 1 118 | sizhu[4] = [] 119 | sizhu[4][0] = ( sizhu[1][0] + yun_cycle * shun_or_ni ) % 10 120 | sizhu[4][1] = ( sizhu[1][1] + yun_cycle * shun_or_ni ) % 12 121 | 122 | (0...4).each { |i| 123 | sizhu[i+5] = current_sizhu[i] 124 | } 125 | 126 | # 流分 127 | sizhu[9] = [] 128 | sizhu[9][1] = ( (current_date.hour + 1 ) % 2 ) * 6 + ( current_date.minute / 10 ) 129 | sizhu[9][0] = ( v["推干法"][sizhu[8][0]] + sizhu[9][1] ) % 10 130 | 131 | # 流秒 132 | sizhu[10] = [] 133 | sizhu[10][1] = (( current_date.minute % 10 ) * 60 + current_date.second )/ 50 134 | sizhu[10][0] = ( v["推干法"][sizhu[9][0]] + sizhu[10][1] ) % 10 135 | 136 | 137 | shishen = [] 138 | 139 | (0...11).each { |i| 140 | 141 | gan_element = v["干五行"][ sizhu[i][0] ] 142 | zhi_element = v["支五行"][ sizhu[i][1] ] 143 | 144 | shishen[i] = [] if shishen[i] == nil 145 | 146 | gan_shishen_yinyang = ( gan_element - rizhu ) % 2 147 | gan_dist_from_rizhu = ( gan_element - rizhu ) % 10 148 | 149 | shishen[i][0] = ((( gan_dist_from_rizhu + gan_shishen_yinyang ) /2 ) % 5 ) * 2 + gan_shishen_yinyang 150 | 151 | 152 | zhi_shishen_yinyang = ( zhi_element - rizhu ) % 2 153 | zhi_dist_from_rizhu = ( zhi_element - rizhu ) % 10 154 | 155 | shishen[i][1] = ((( zhi_dist_from_rizhu + zhi_shishen_yinyang ) /2 ) % 5 ) * 2 + zhi_shishen_yinyang 156 | 157 | } 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | printf "\n\n" 167 | printf "本命 | 大 流 流 流 | 流 流 流\n" 168 | printf "年 月 日 时 | 运 年 月 日 | 时 刻 秒\n" 169 | printf "--------------------------------------------------\n" 170 | 171 | printf "%s %s %s %s | %s %s %s %s | %s %s %s\n" , 172 | v["十神"][shishen[0][0]], 173 | v["十神"][shishen[1][0]], 174 | "日", 175 | v["十神"][shishen[3][0]], 176 | v["十神"][shishen[4][0]], 177 | v["十神"][shishen[5][0]], 178 | v["十神"][shishen[6][0]], 179 | v["十神"][shishen[7][0]], 180 | v["十神"][shishen[8][0]], 181 | v["十神"][shishen[9][0]], 182 | v["十神"][shishen[10][0]] 183 | 184 | 185 | 186 | 187 | printf "%s %s %s %s | %s %s %s %s | %s %s %s\n" , 188 | v["天干"][sizhu[0][0]], 189 | v["天干"][sizhu[1][0]], 190 | v["天干"][sizhu[2][0]], 191 | v["天干"][sizhu[3][0]], 192 | v["天干"][sizhu[4][0]], 193 | v["天干"][sizhu[5][0]], 194 | v["天干"][sizhu[6][0]], 195 | v["天干"][sizhu[7][0]], 196 | v["天干"][sizhu[8][0]], 197 | v["天干"][sizhu[9][0]], 198 | v["天干"][sizhu[10][0]] 199 | 200 | 201 | 202 | printf "%s %s %s %s | %s %s %s %s | %s %s %s\n" , 203 | v["地支"][sizhu[0][1]], 204 | v["地支"][sizhu[1][1]], 205 | v["地支"][sizhu[2][1]], 206 | v["地支"][sizhu[3][1]], 207 | v["地支"][sizhu[4][1]], 208 | v["地支"][sizhu[5][1]], 209 | v["地支"][sizhu[6][1]], 210 | v["地支"][sizhu[7][1]], 211 | v["地支"][sizhu[8][1]], 212 | v["地支"][sizhu[9][1]], 213 | v["地支"][sizhu[10][1]] 214 | 215 | 216 | printf "%s %s %s %s | %s %s %s %s | %s %s %s\n" , 217 | v["十神"][shishen[0][1]], 218 | v["十神"][shishen[1][1]], 219 | v["十神"][shishen[2][1]], 220 | v["十神"][shishen[3][1]], 221 | v["十神"][shishen[4][1]], 222 | v["十神"][shishen[5][1]], 223 | v["十神"][shishen[6][1]], 224 | v["十神"][shishen[7][1]], 225 | v["十神"][shishen[8][1]], 226 | v["十神"][shishen[9][1]], 227 | v["十神"][shishen[10][1]] 228 | 229 | 230 | 231 | 232 | puts "------------------------------------------" 233 | printf "\n\n大运\n" 234 | 235 | n = 8 236 | (0...n).each { |i| 237 | printf "%s ", ( qiyunyear + i * 10 ) 238 | } 239 | printf "\n" 240 | (1..n).each { |i| 241 | printf "%s ",v["天干"][ ( sizhu[1][0] + i * shun_or_ni) % 10 ] 242 | } 243 | printf "\n" 244 | (1..n).each { |i| 245 | printf "%s ",v["地支"][ ( sizhu[1][1] + i * shun_or_ni ) % 12 ] 246 | } 247 | printf "\n\n" 248 | 249 | end 250 | 251 | main 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | -------------------------------------------------------------------------------- /qimen.rb: -------------------------------------------------------------------------------- 1 | #encoding: utf-8 2 | 3 | # Work in Progress... 4 | 5 | require_relative 'cdate' 6 | require_relative 'goleph.rb' 7 | require 'time' 8 | 9 | def main() 10 | 11 | v = {} 12 | 13 | # 0 1 2 3 4 5 6 7 8 9 10 11 14 | v["天干"] = [ "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸" ] 15 | v["地支"] = [ "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"] 16 | 17 | # 0 1 2 3 4 5 6 7 8 9 18 | v["五行"] = ["阳木","阴木","阳火","阴火","阳土","阴土","阳金","阴金","阳水","阴水"] 19 | 20 | v["干五行"] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] 21 | v["支五行"] = [ 8, 5, 0, 1, 4, 3, 2, 5, 6, 7, 4, 9] 22 | 23 | v["支藏干"] = [ 24 | [9], 25 | [5,9,7], 26 | [0,2,4], 27 | [1], 28 | [4,1,9], 29 | [2,6,4], 30 | [3,5], 31 | [5,3,1], 32 | [6,8,4], 33 | [7], 34 | [4,7,3], 35 | [8,0] 36 | ] 37 | 38 | v["干阴阳"] = [ 1, -1, 1 , -1, 1, -1, 1, -1, 1, -1 ] 39 | v["支阴阳"] = [ 1, -1, 1 , -1, 1, -1, 1, -1, 1, -1 , 1 , -1 ] 40 | 41 | v["推干法"] = [ 0, 2, 4 , 6, 8, 0, 2, 4, 6, 8 ] 42 | v["节气"] = ['冬至','小寒','大寒','立春','雨水','惊蛰','春分','清明','谷雨','立夏','小满','芒种','夏至','小暑','大暑','立秋','处暑','白露','秋分','寒露','霜降','立冬','小雪','大雪'] 43 | 44 | # 三奇六仪: 戊、己、庚、辛、壬、癸、丁、丙、乙 45 | # w.r.t 天干 index 46 | v["三奇六仪"] = [ 4,5,6,7,8,9 , 3,2,1 ] 47 | 48 | 49 | 50 | # 阳遁 51 | #上     中     下 52 | #冬至一七四 小寒二八五 大寒三九六 53 | #立春八五二 雨水九六三 惊蛰一七四 54 | #春分三九六 清明四一七 谷雨五二八 55 | #立夏四一七 小满五二八 芒种六三九 56 | 57 | # 阴遁 58 | #上     中     下 59 | #夏至九三六 小暑八二五 大暑七一四 60 | #立秋二五八 处暑一四七 白露九三六 61 | #秋分七一四 寒露六九三 霜降五八二 62 | #立冬六九三 小雪五八一 大雪四七一 63 | 64 | v["三元"] = [ [1,7,4] , [2,8,5] , [3,9,6], 65 | [8,5,2] , [9,6,3] , [1,7,4], 66 | [3,9,6] , [4,1,7] , [5,2,8], 67 | [4,1,7] , [5,2,8] , [6,3,9], 68 | [9,3,6] , [8,2,5] , [7,1,4], 69 | [2,5,8] , [1,4,7] , [9,3,6], 70 | [7,1,4] , [6,9,3] , [5,8,2], 71 | [6,9,3] , [5,8,1] , [4,7,1] 72 | ] 73 | 74 | 75 | v["宫"] = [ "", "坎","坤","震", "巽","中","乾","兑","艮","离" ] 76 | 77 | # 4 9 2 78 | # 3 5 7 79 | # 8 1 6 80 | # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 81 | v["宫顺时"] = [ 0, 8, 7, 4, 9, 2, 1, 6, 3, 2 ] 82 | v["宫逆时"] = [ 0, 6, 9, 8, 3, 2, 7, 2, 1, 4 ] 83 | 84 | 85 | # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 86 | v["九星"] = [ "" ,"天蓬", "天芮", "天冲", "天辅", "", "天心" ,"天柱", "天任" , "天英" ] 87 | v["八神"] = [ "直符", "腾蛇", "太阴" ,"六合", "白虎" ,"玄武" ,"九地" ,"九天" ] 88 | v["八门"] = [ "" , "休门", "死门" , "伤门" , "杜门" ,"", "开门", "惊门", "生门" , "景门"] 89 | 90 | # "子" "戌" "申" "午" "辰" "寅" 91 | v["旬支"] = [ 0, 10, 8 , 6 , 4, 2 ] 92 | 93 | #申子辰 寅午戌 亥卯未 巳酉丑 94 | v["三合"] = [ [8,0,4] , [2,6,10] , [11,3,7] , [5,9,1] ] 95 | v["三合马星"] = [ 8,6,2,4, 8,6,2,4, 8,6,2,4 ] 96 | 97 | #甲子旬中戌亥空;甲寅旬中子丑空;甲辰旬中寅卯空; 98 | #甲午旬中辰巳空;甲申旬中午未空;甲戌旬中申酉空 99 | v["空亡"] = [ [6], [7,2] , [9,2] , [4] , [3,8] , [1,8] ] 100 | 101 | nongli = CDate.new() 102 | 103 | subject_date = ARGV[0]? DateTime.parse( ARGV[0] ) : DateTime.now() 104 | sizhu = nongli.bazi( subject_date ) 105 | subject_jieqi = nongli.to_ccal2(subject_date)[:term] 106 | subject_jieqi_index = v["节气"].index(subject_jieqi) 107 | 108 | sanyuan = v["三元"][subject_jieqi_index] 109 | yangyindun = subject_jieqi_index / 12 110 | 111 | nth_day = 0 112 | (1..30).each { |i_d| 113 | jieqi = nongli.to_ccal2(subject_date - i_d )[:term] 114 | if jieqi != subject_jieqi 115 | break 116 | end 117 | nth_day += 1 118 | } 119 | 120 | sanyuan_index = nth_day / 5 121 | ju = sanyuan[sanyuan_index] 122 | 123 | 124 | 125 | 126 | # 2. 地盘 127 | 128 | dipan = [] 129 | (0...9).each { |i| 130 | if yangyindun == 0 131 | dipan[ (((ju - 1) + i ) % 9 ) + 1 ] = v["三奇六仪"][i] 132 | else 133 | dipan[ (((ju - 1) - i ) % 9 ) + 1 ] = v["三奇六仪"][i] 134 | end 135 | } 136 | 137 | 138 | # 3. # 2. 天盘 口诀: 符首定在地盘时干上。 139 | tianpan = [0] 140 | fushou = ((( (sizhu[3][0] - sizhu[3][1]) % 12 ) / 2 ) + 4 ) % 10 141 | 142 | d_start = t_start = ori_d_start = 0 143 | 144 | (1..9).each { |i| 145 | # i is gong index 146 | 147 | if dipan[i] == fushou 148 | d_start = i 149 | ori_d_start = i 150 | d_start = 2 if d_start == 5 151 | t_start = i if sizhu[3][0] == 0 152 | end 153 | if dipan[i] == sizhu[3][0] 154 | t_start = i 155 | t_start = 2 if t_start == 5 156 | tianpan[i] = fushou 157 | end 158 | } 159 | 160 | 161 | 162 | 163 | t_i = v["宫顺时"][t_start] 164 | d_i = v["宫顺时"][d_start] 165 | 166 | (0...8).each { |i| 167 | tianpan[ t_i ] = dipan[d_i] 168 | d_i = v["宫顺时"][d_i] 169 | t_i = v["宫顺时"][t_i] 170 | } 171 | 172 | 173 | #4. 安九星: 值符随时干走 174 | 175 | jiuxing = [0]*10 176 | t_start = 2 if t_start == 5 177 | jiuxing[t_start] = d_start 178 | 179 | 180 | 181 | 182 | bashen = [0]*10 183 | bashen[t_start] = 0 184 | 185 | 186 | # 5. 八门根据 值使 187 | 188 | # 旬支 189 | xunzhi = v["旬支"][ ((sizhu[3][0] - sizhu[3][1]) % 12 ) / 2 ] 190 | 191 | steps_to_take = ( sizhu[3][1] - xunzhi ) % 12 192 | 193 | # 值使 走几步 194 | if yangyindun == 0 195 | # 旬支 到 时支 几步 ? 196 | #steps_to_take = ( sizhu[3][1] - xunzhi ) % 12 197 | t2_start = (( ( ori_d_start - 1 ) + steps_to_take ) % 9 ) + 1 198 | else 199 | #steps_to_take = ( xunzhi - sizhu[3][1] ) % 12 200 | t2_start = (( ( ori_d_start - 1 ) - steps_to_take ) % 9 ) + 1 201 | end 202 | t2_start = 2 if t2_start ==5 203 | 204 | 205 | bamen = [0] * 10 206 | bamen[t2_start] = d_start 207 | 208 | t_i = v["宫顺时"][t_start] 209 | t_i_rev = v["宫逆时"][t_start] 210 | t2_i = v["宫顺时"][t2_start] 211 | 212 | xing_i = d_start 213 | 214 | 215 | (1..7).each { |i| 216 | xing_i = v["宫顺时"][xing_i] 217 | jiuxing[t_i] = xing_i 218 | bamen[t2_i] = xing_i 219 | if yangyindun == 0 220 | bashen[t_i] = i 221 | else 222 | bashen[t_i_rev] = i 223 | end 224 | t_i = v["宫顺时"][t_i] 225 | t_i_rev = v["宫逆时"][t_i_rev] 226 | t2_i = v["宫顺时"][t2_i] 227 | } 228 | 229 | ma_xing_pos = v["三合马星"][sizhu[3][1]] 230 | ma_xing = [" "] * 9 231 | ma_xing[ ma_xing_pos ] = "马" 232 | 233 | jiaxun = (( (sizhu[3][0] - sizhu[3][1]) % 12 ) / 2 ) % 10 234 | kong_wang = [" "] * 9 235 | v["空亡"][jiaxun].each { |gong_index| 236 | kong_wang[gong_index] = "空亡" 237 | } 238 | 239 | 240 | # Printing... 241 | 242 | # Print Bazi 243 | (0...4).each { |i| 244 | print "#{v["天干"][sizhu[i][0]]}#{v["地支"][sizhu[i][1]]} " 245 | } 246 | 247 | # Print relevant infos 248 | printf "\n" 249 | printf "%s%s局 \n" , ["阳","阴"][yangyindun] , ju 250 | printf "节气: %s\n", subject_jieqi 251 | printf "旬首: 甲%s , 符首: %s , 值符: %s, 值使: %s\n" , v["地支"][xunzhi] , v["天干"][fushou] , v["九星"][d_start], v["八门"][d_start] 252 | 253 | puts "\n\n" 254 | 255 | 256 | # Print 9 gong 257 | 258 | printf " %s| %s| %s\n" , v["天干"][tianpan[4]], v["天干"][tianpan[9]], v["天干"][tianpan[2]] 259 | printf " %s| %s| %s\n" , v["天干"][dipan[4]] , v["天干"][dipan[9]] , v["天干"][dipan[2]] 260 | printf "%s |%s |%s \n" , v["八神"][bashen[4]], v["八神"][bashen[9]], v["八神"][bashen[2]] 261 | 262 | printf "%s |%s |%s \n" , v["九星"][jiuxing[4]], v["九星"][jiuxing[9]], v["九星"][jiuxing[2]] 263 | printf "%s |%s |%s \n" , v["八门"][bamen[4]], v["八门"][bamen[9]], v["八门"][bamen[2]] 264 | printf "%s | |%s \n" , ma_xing[4],ma_xing[2] 265 | printf "%s |%s |%s \n" , kong_wang[4], kong_wang[9],kong_wang[2] 266 | printf " | | \n" 267 | printf "%s |%s |%s \n" , v["宫"][4],v["宫"][9],v["宫"][2] 268 | 269 | 270 | printf "----------------------------------------\n" 271 | printf " %s| | %s\n" , v["天干"][tianpan[3]], v["天干"][tianpan[7]] 272 | printf " %s| %s| %s\n" , v["天干"][dipan[3]] , v["天干"][dipan[5]] , v["天干"][dipan[7]] 273 | printf "%s | |%s \n" , v["八神"][bashen[3]], v["八神"][bashen[7]] 274 | 275 | printf "%s | |%s \n" , v["九星"][jiuxing[3]], v["九星"][jiuxing[7]] 276 | printf "%s | |%s \n" , v["八门"][bamen[3]], v["八门"][bamen[7]] 277 | printf "%s | |%s \n" , kong_wang[3], kong_wang[7] 278 | printf " | | \n" 279 | printf " | | \n" 280 | printf " | | \n" 281 | printf "%s |%s |%s \n" , v["宫"][3],v["宫"][5],v["宫"][7] 282 | 283 | 284 | printf "----------------------------------------\n" 285 | 286 | printf " %s| %s| %s\n" , v["天干"][tianpan[8]], v["天干"][tianpan[1]], v["天干"][tianpan[6]] 287 | printf " %s| %s| %s\n" , v["天干"][dipan[8]] , v["天干"][dipan[1]] , v["天干"][dipan[6]] 288 | printf "%s |%s |%s \n" , v["八神"][bashen[8]], v["八神"][bashen[1]], v["八神"][bashen[6]] 289 | 290 | printf "%s |%s |%s \n" , v["九星"][jiuxing[8]], v["九星"][jiuxing[1]], v["九星"][jiuxing[6]] 291 | printf "%s |%s |%s \n" , v["八门"][bamen[8]], v["八门"][bamen[1]], v["八门"][bamen[6]] 292 | printf "%s | |%s \n" , ma_xing[8],ma_xing[6] 293 | printf "%s |%s |%s \n" , kong_wang[8], kong_wang[1],kong_wang[6] 294 | printf " | | \n" 295 | printf "%s |%s |%s \n" , v["宫"][8],v["宫"][1],v["宫"][6] 296 | 297 | 298 | end 299 | 300 | main 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | -------------------------------------------------------------------------------- /cdate.rb: -------------------------------------------------------------------------------- 1 | #encoding: utf-8 2 | 3 | # Copyright (C) 2010 oCameLo. All rights reserved. 4 | 5 | # coding: UTF-8 6 | require 'date' 7 | 8 | class CDate 9 | 10 | # 根据不同locale保存简体或繁体的数据 11 | attr_accessor :stems, :branches, :animals, :months, :days, :terms, :leap, :astrologies 12 | 13 | def initialize( ) 14 | # 按年份保存的cache 15 | @cache = {} 16 | 17 | # 检测locale信息 18 | #locale 19 | chs 20 | 21 | end 22 | 23 | private 24 | 25 | # 简体 26 | def chs 27 | @leap = '闰' 28 | 29 | ## 月名称,建寅 30 | # 春秋、战国时闰月名十三,秦汉时闰月名后九 31 | # 最后的那个一是武媚娘搞出来的特例 32 | @months = ['十一','十二','正','二','三','四','五','六','七','八','九','十'] + ['十三', '后九', '一'] 33 | 34 | ## 日名称 35 | @days = ['初一','初二','初三','初四','初五','初六','初七','初八','初九','初十','十一','十二','十三','十四','十五','十六','十七','十八','十九','二十','廿一','廿二','廿三','廿四','廿五','廿六','廿七','廿八','廿九','三十','卅一'] 36 | 37 | # 天干 38 | @stems = ['甲','乙','丙','丁','戊','己','庚','辛','壬','癸'] 39 | 40 | # 地支 41 | @branches = ['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥'] 42 | 43 | # 生肖 44 | @animals = ['鼠','牛','虎','兔','龙','蛇','马','羊','猴','鸡','狗','猪'] 45 | 46 | # 节气 47 | @terms = ['冬至','小寒','大寒','立春','雨水','惊蛰','春分','清明','谷雨','立夏','小满','芒种','夏至','小暑','大暑','立秋','处暑','白露','秋分','寒露','霜降','立冬','小雪','大雪'] 48 | 49 | # 星座 50 | @astrologies = ['摩羯','水瓶','双鱼','白羊','金牛','双子','巨蟹','狮子','处女','天秤','天蝎','射手'] 51 | end 52 | 53 | # 繁体 54 | def cht 55 | @leap = '閏' 56 | @months = ['十一','十二','正','二','三','四','五','六','七','八','九','十'] + ['十三', '後九', '一'] 57 | @days = ['初一','初二','初三','初四','初五','初六','初七','初八','初九','初十','十一','十二','十三','十四','十五','十六','十七','十八','十九','二十','廿一','廿二','廿三','廿四','廿五','廿六','廿七','廿八','廿九','三十','卅一'] 58 | @stems = ['甲','乙','丙','丁','戊','己','庚','辛','壬','癸'] 59 | @branches = ['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥'] 60 | @animals = ['鼠','牛','虎','兔','龍','蛇','馬','羊','猴','雞','狗','豬'] 61 | @terms = ['冬至','小寒','大寒','立春','雨水','驚蟄','春分','清明','穀雨','立夏','小滿','芒種','夏至','小暑','大暑','立秋','處暑','白露','秋分','寒露','霜降','立冬','小雪','大雪'] 62 | @astrologies = ['摩羯','水瓶','雙魚','白羊','金牛','雙子','巨蟹','獅子','處女','天秤','天蠍','射手'] 63 | end 64 | 65 | # 使用环境变量获取locale信息 66 | def locale_env 67 | if (e = ENV['LANG'] || ENV['LC_ALL']) && e.downcase! then 68 | case e[0..4] 69 | when 'zh_sg' 70 | return :zh_sg 71 | when 'zh_tw' 72 | return :zh_tw 73 | when 'zh_hk' 74 | return :zh_hk 75 | when 'zh_mo' 76 | return :zh_mo 77 | else 78 | return :zh_cn 79 | end 80 | else 81 | return :zh_cn 82 | end 83 | end 84 | 85 | # 使用Windows API获取locale信息 86 | def locale_win32api 87 | begin 88 | require 'dl' 89 | require 'dl/import' 90 | # GetSystemDefaultLCID的返回值可以在下面这里查到 91 | # http://msdn.microsoft.com/en-us/library/dd318693(v=VS.85).aspx 92 | # (SUBLANG_ID<<10) + LANG_ID 93 | lcid = DL.dlopen('kernel32') do |h| 94 | addr = h.sym('GetSystemDefaultLCID') 95 | cfunc = DL::CFunc.new(addr, DL::TYPE_INT) 96 | func = DL::Function.new(cfunc, [DL::TYPE_VOID]) 97 | func.call 98 | end 99 | case lcid 100 | when 0x404 # 台湾 101 | return :zh_tw 102 | when 0xc04 # 香港 103 | return :zh_hk 104 | when 0x1404 # 澳门 105 | return :zh_mo 106 | when 0x1004 # 新加坡 107 | return :zh_sg 108 | else # 大陆是0x804 109 | return :zh_cn 110 | end 111 | rescue 112 | return :zh_cn 113 | end 114 | end 115 | 116 | public 117 | 118 | # 根据儒略日数算公历 119 | def jd2date(jd) 120 | raise ArgumentError, 'jd cannot be negative.' if jd < 0 121 | 122 | t = jd + 0.5 123 | z = t.floor 124 | f = t - z 125 | 126 | a = if z < 2299161 then 127 | z 128 | else 129 | t = ((z-1867216.25)/36524.25).floor 130 | z + 1 + t - (t/4.0).floor 131 | end 132 | b = a + 1524 133 | c = ((b-122.1)/365.25).floor 134 | d = (365.25*c).floor 135 | e = ((b-d)/30.6001).floor 136 | 137 | day = b - d - (30.6001*e).floor + f 138 | month = (e < 14 ? e-1 : e-13) 139 | year = (month > 2 ? c-4716 : c-4715) 140 | 141 | return [year, month, day] 142 | end 143 | 144 | # 根据公历算儒略日数 145 | def date2jd(year, month, day) 146 | raise ArgumentError, 'year cannot be less than -4712' if year < -4712 147 | 148 | if month <= 2 then 149 | year -= 1; month += 12 150 | end 151 | 152 | b = if year < 1582 or (year == 1582 and month < 10) or (year == 1582 and month == 10 and day <= 4) then 153 | 0 154 | else 155 | a = (year/100.0).floor 156 | 2 - a + (a/4.0).floor 157 | end 158 | 159 | return (365.25*(year+4716)).floor + (30.6001*(month+1)).floor + day + b - 1524.5 160 | end 161 | 162 | 163 | 164 | # 根据公历算儒略日数 165 | def date2jd2(year, month, day, hour) 166 | raise ArgumentError, 'year cannot be less than -4712' if year < -4712 167 | 168 | if month <= 2 then 169 | year -= 1; month += 12 170 | end 171 | 172 | b = if year < 1582 or (year == 1582 and month < 10) or (year == 1582 and month == 10 and day <= 4) then 173 | 0 174 | else 175 | a = (year/100.0).floor 176 | 2 - a + (a/4.0).floor 177 | end 178 | 179 | return (365.25*(year+4716)).floor + (30.6001*(month+1)).floor + day + b - 1524.5 + hour / 24.0 180 | end 181 | 182 | 183 | 184 | # 设置语言环境 185 | # loc可为:zh_cn, :zh_sg, :zh_tw, :zh_hk, :zh_mo其中之一 186 | # 如不给出loc则尝试自动判断 187 | def locale(loc = nil) 188 | # 默认采用简体中文 189 | @loc = :zh_cn 190 | 191 | if loc then 192 | @loc = loc if loc == :zh_sg or loc == :zh_tw or loc == :zh_hk or loc == :zh_mo 193 | else # 未给定loc,尝试自动判断 194 | # 有环境变量则采用 195 | if ENV['LANG'] || ENV['LC_ALL'] then 196 | @loc = locale_env 197 | elsif RUBY_PLATFORM =~ /cygwin|mingw|mswin/ then 198 | # 无环境变量并在Windows内则使用API 199 | @loc = locale_win32api 200 | end 201 | end 202 | 203 | # 目前不同locale就只有简繁体的区别 204 | if @loc == :zh_tw or @loc == :zh_hk or @loc == :zh_mo then 205 | cht 206 | else 207 | chs 208 | end 209 | end 210 | 211 | # 获取某年的农历数据 212 | # 213 | # jd为当年某日的儒略日数 214 | # 215 | # 返回一个包括实参对应日期所在年份农历数据的Hash: 216 | # 217 | # * :leap => int # 闰月位置 218 | # * :cd0 => jd # 当年的正月初一 219 | # * :ym => [] # 农历月名 220 | # * :zq => {} # 中气表 221 | # * :hs => [] # 合朔表 222 | # * :dx => [] # 各月大小 223 | def calc_year(jd) 224 | year = jd2date(jd)[0] # jd2date比Date类算起来快 225 | return @cache[year] if @cache.has_key?(year) 226 | 227 | dat = CCal::GolEph.calc_y(jd - CCal::GolEph::J2000) 228 | 229 | # 找正月初一,即春节 230 | i = dat[:hs][2] # 一般第三个月为正月 231 | 0.upto(13) do |j| 232 | next if dat[:ym][j] != 2 || (dat[:leap] == j && j != 0) 233 | i = dat[:hs][j] 234 | end 235 | dat[:cd0] = i 236 | 237 | @cache[year] = dat 238 | return dat 239 | end 240 | 241 | # 获取某日的农历数据 242 | # 243 | # jd为该日儒略日数, 244 | # 245 | # 返回一个包括实参对应日期所在日农历数据的Hash: 246 | # 247 | # * :stem => string # 当年天干 248 | # * :branch => string # 当年地支 249 | # * :animal => string # 当年生肖 250 | # * :cmonth => string # 月名 251 | # * :cmleap => bool # 当月是否为闰月 252 | # * :cmdays => int # 当月天数,用以判断月大小 253 | # * :cday => string # 日名 254 | # * :term => string # 当日所含节气,无节气为nil 255 | # * :astrology => string # 星座 256 | # 257 | def calc_day(jd) 258 | dat = calc_year(jd) 259 | jd -= CCal::GolEph::J2000 # 底层代码以2k年起算 260 | d = {} 261 | 262 | # 干支纪年、生肖 263 | i = dat[:cd0] 264 | i -= 365 if jd < i 265 | i += 5810 ## 计算该年春节与1984年平均春节(立春附近)相差天数估计 266 | i = (i/365.2422+0.5).floor ## 农历纪年(10进制,1984年起算) 267 | i += 9000 268 | # .Net的ChineseLunisolarCalendar类里边 269 | # 天干翻做Celestial Stem,地支翻作Terrestrial Branch 270 | d[:stem] = @stems[i%10] 271 | i = i%12; d[:branch] = @branches[i]; d[:animal] = @animals[i] 272 | 273 | # 干支纪月 274 | ## 1998年12月7(大雪)开始连续进行节气计数,0为甲子 275 | i = ((jd-dat[:zq][0])/ 30.43685).floor 276 | ## 相对大雪的月数计算,mk的取值范围0-12 277 | i += 1 if i<12 && jd>=dat[:zq][2*i+1] 278 | ## 相对于1998年12月7(大雪)的月数,900000为正数基数 279 | i = i + ((dat[:zq][12]+390)/365.2422).floor * 12 + 900000; 280 | d[:stem_m] = @stems[i%10]; d[:branch_m] = @branches[i%12] 281 | 282 | # 干支纪日 283 | ## 2000年1月7日起算 284 | i = jd - 6 + 9000000 285 | d[:stem_d] = @stems[i%10]; d[:branch_d] = @branches[i%12] 286 | 287 | # 月 288 | i = ((jd - dat[:hs][0])/30).floor 289 | i += 1 if i<13 && dat[:hs][i+1]<=jd 290 | d[:cmleap] = dat[:leap] == i ? true : false # 是否闰月 291 | d[:cmdays] = dat[:dx][i] # 该月多少天,判断大小月 292 | d[:cmonth] = @months[dat[:ym][i]] 293 | 294 | d[:imonth] = (dat[:ym][i] - 2) % 12 295 | d[:iday] = (jd - dat[:hs][i]).floor() 296 | 297 | # 日 298 | d[:cday] = @days[jd - dat[:hs][i]] 299 | 300 | # 节气 301 | i = ((jd - dat[:zq][0] - 7)/15.2184).floor 302 | i += 1 if i < 23 && jd >= dat[:zq][i+1] 303 | 304 | d[:term] = jd == dat[:zq][i] ? @terms[i] : '' 305 | 306 | # 星座 307 | # 好吧,农历也弄这个蛮无聊的其实 308 | i = ((jd - dat[:zq][0] - 15)/30.43685).floor 309 | i += 1 if i<11 && jd>=dat[:zq][2*i+2] 310 | d[:astrology] = @astrologies[i%12] 311 | 312 | return d 313 | end 314 | 315 | def from_ccal(cyear, cmonth, cday, leap = false) 316 | # 后端中正月是2,11月和12月分别是0和1 317 | cmonth += cmonth > 10 ? -11 : 1 318 | jd = date2jd(cyear, 1, 1) 319 | dat = calc_year(jd) 320 | m = dat[:ym].index(2) # 正月的位置 321 | n = dat[:ym].index(cmonth) # 目标月的位置 322 | if n < m then 323 | # 目标月在正月之前,说明该月属于下一年 324 | jd += 366 325 | dat = calc_year(jd) 326 | n = dat[:ym].index(cmonth) 327 | end 328 | 329 | if leap then 330 | # 要找的是一个闰月 331 | raise "#{cyear} deosn't have a leap month" if dat[:leap] == 0 332 | raise "wrong leap month number" if dat[:ym][dat[:leap]] != cmonth 333 | n += 1 334 | end 335 | 336 | d = jd2date(dat[:hs][n] + cday - 1 + CCal::GolEph::J2000) 337 | d[2] -= 0.5 338 | return d 339 | end 340 | 341 | 342 | def to_ccal( dt ) 343 | jdt = date2jd( dt.year, dt.month , dt.day + 1 ) 344 | return calc_day( jdt ); 345 | end 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | def calc_day2(jd) 359 | 360 | dat = calc_year(jd) 361 | jd -= CCal::GolEph::J2000 # 底层代码以2k年起算 362 | d = {} 363 | 364 | 365 | # 干支纪年、生肖 366 | i = dat[:cd0] 367 | i -= 365 if jd < i 368 | i += 5810 ## 计算该年春节与1984年平均春节(立春附近)相差天数估计 369 | i = (i/365.2422+0.5).floor ## 农历纪年(10进制,1984年起算) 370 | i += 9000 371 | # .Net的ChineseLunisolarCalendar类里边 372 | # 天干翻做Celestial Stem,地支翻作Terrestrial Branch 373 | d[:stem] = @stems[i%10] 374 | i = i%12; d[:branch] = @branches[i]; d[:animal] = @animals[i] 375 | 376 | # 干支纪月 377 | ## 1998年12月7(大雪)开始连续进行节气计数,0为甲子 378 | i = ((jd - dat[:zq][0])/ 30.43685).floor 379 | ## 相对大雪的月数计算,mk的取值范围0-12 380 | 381 | i = 0 if i < 0 382 | 383 | i += 1 if i<12 && jd>=dat[:zq][2*i+1] 384 | ## 相对于1998年12月7(大雪)的月数,900000为正数基数 385 | i = i + ((dat[:zq][12]+390)/365.2422).floor * 12 + 900000; 386 | d[:stem_m] = @stems[i%10]; d[:branch_m] = @branches[i%12] 387 | 388 | # 干支纪日 389 | ## 2000年1月7日起算 390 | i = jd - 6 + 9000000 391 | d[:stem_d] = @stems[i%10]; d[:branch_d] = @branches[i%12] 392 | 393 | # 月 394 | i = ((jd - dat[:hs][0])/30).floor 395 | i += 1 if i<13 && dat[:hs][i+1]<=jd 396 | d[:cmleap] = dat[:leap] == i ? true : false # 是否闰月 397 | d[:cmdays] = dat[:dx][i] # 该月多少天,判断大小月 398 | d[:cmonth] = @months[dat[:ym][i]] 399 | 400 | d[:imonth] = (dat[:ym][i] - 2) % 12 401 | d[:iday] = (jd - dat[:hs][i]).floor() 402 | 403 | # 日 404 | d[:cday] = @days[jd - dat[:hs][i]] 405 | 406 | # 节气 407 | i = ((jd - dat[:zq][0] - 7)/15.2184).floor 408 | i += 1 if i < 23 && jd >= dat[:zq][i+1] 409 | 410 | #d[:term] = jd == dat[:zq][i] ? @terms[i] : '' 411 | d[:term] = @terms[i] 412 | 413 | # 星座 414 | # 好吧,农历也弄这个蛮无聊的其实 415 | i = ((jd - dat[:zq][0] - 15)/30.43685).floor 416 | i += 1 if i<11 && jd>=dat[:zq][2*i+2] 417 | d[:astrology] = @astrologies[i%12] 418 | 419 | return d 420 | end 421 | 422 | 423 | def to_ccal2( dt ) 424 | jdt = date2jd2( dt.year, dt.month , dt.day , dt.hour ) 425 | return calc_day2( jdt ); 426 | end 427 | 428 | 429 | 430 | 431 | # 时区到经度的对应值 432 | ZONE2LNG = {-12=>-3.141592653589793, -11=>-2.8797932657906435, -10=>-2.6179938779914944, -9=>-2.356194490192345, -8=>-2.0943951023931953, -7=>-1.832595714594046, -6=>-1.5707963267948966, -5=>-1.3089969389957472, -4=>-1.0471975511965976, -3=>-0.7853981633974483, -2=>-0.5235987755982988, -1=>-0.2617993877991494, 0=>0.0, 1=>0.2617993877991494, 2=>0.5235987755982988, 3=>0.7853981633974483, 4=>1.0471975511965976, 5=>1.3089969389957472, 6=>1.5707963267948966, 7=>1.832595714594046, 8=>2.0943951023931953, 9=>2.356194490192345, 10=>2.6179938779914944, 11=>2.8797932657906435, 12=>3.141592653589793} 433 | 434 | # 计算八字 435 | # 436 | # 参数为DateTime类型 437 | # 438 | # 算八字需要准确的经度,否则时间的部分误差会非常大,这个函数似乎还是删掉的好。 439 | # 440 | def bazi(dt) 441 | zone = (dt.offset*24).to_i 442 | jd = dt.jd - 0.5 # ruby总是返回整数,减0.5得午夜0时的儒略日数 443 | jd += (dt.hour+dt.min/60.0)/24.0 # 加上时间,ruby没算这个部分 444 | jd -= zone/24.0 # 修正时差 445 | jd -= CCal::GolEph::J2000 446 | lng = ZONE2LNG[zone] # 根据时区获得近似经度 447 | 448 | jd2 = jd + CCal::GolEph.dt_t(jd) ## 力学时 449 | w = CCal::GolEph.s_alon(jd2/36525.0, -1) ## 此刻太阳视黄经 450 | k = ((w/(Math::PI*2)*360+45+15*360)/30.0).floor ## 1984年立春起算的节气数(不含中气) 451 | jd += CCal::GolEph.pty_zty2(jd2/36525.0)+lng/Math::PI/2 ## 本地真太阳时(使用低精度算法计算时差) 452 | 453 | jd += 13/24.0 ## 转为前一日23点起算 454 | _d = (jd).floor; _sc = ((jd-_d)*12).floor ## 日数与时辰 455 | 456 | r = [] 457 | v = (k/12.0+6000000).floor; r.push [v%10, v%12] 458 | v = k+2+60000000; r.push [v%10, v%12] 459 | v = _d-6+9000000; r.push [v%10, v%12] 460 | v = (_d-1)*12+90000000+_sc; r.push [v%10, v%12] 461 | 462 | return r 463 | end 464 | end 465 | 466 | 467 | 468 | -------------------------------------------------------------------------------- /ziwei.rb: -------------------------------------------------------------------------------- 1 | #encoding: utf-8 2 | 3 | 4 | require_relative 'cdate' 5 | require_relative 'goleph.rb' 6 | require 'time' 7 | 8 | 9 | 10 | 11 | def main() 12 | 13 | 14 | if ARGV.length < 1 15 | puts "Usage: ruby ziwei.rb [] []" 16 | return 17 | end 18 | 19 | 20 | 21 | v = {} 22 | v["天干"] = [ "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸" ] 23 | v["地支"] = [ "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"] 24 | v["月"] = ['十一','十二','正','二','三','四','五','六','七','八','九','十'] 25 | 26 | v["十二宫"] = [ "命宫", "兄弟", "夫妻", "子女", "财帛", "疾厄", "迁移", "仆役", "官禄", "田宅", "福德", "父母"] 27 | v["五行"] = [ "金","木","水","火","土"] 28 | v["五行局"] = [ "水二","木三","金四","土五","火六" ] 29 | v["长生"] = [ "长生" ,"沐浴" ,"冠带", "临官", "帝旺", "衰", "病", "死", "墓", "绝" ,"胎" ,"养"] 30 | 31 | 32 | o = {} 33 | o["五虎遁"] = [ 2,4,6,8,0,2,4,6,8,0] 34 | o["五鼠遁"] = [ 0,2,4,6,8,0,2,4,6,8] 35 | 36 | 37 | o["五行局"] = { 38 | [ 0,0 ] =>2, [ 0, 1] =>2, [ 0,6 ] =>2, [ 0, 7] =>2, 39 | [ 1,0 ] =>2, [ 1, 1] =>2, [ 1,6 ] =>2, [ 1, 7] =>2, 40 | [ 0,2 ] =>0, [ 0, 3] =>0, [ 0,8 ] =>0, [ 0, 9] =>0, 41 | [ 1,2 ] =>0, [ 1, 3] =>0, [ 1,8 ] =>0, [ 1, 9] =>0, 42 | [ 0,4 ]=>4, [ 0, 5 ]=>4, [ 0,10 ]=>4, [ 0, 11]=>4, 43 | [ 1,4 ]=>4, [ 1, 5 ]=>4, [ 1,10 ]=>4, [ 1, 11]=>4, 44 | 45 | [ 2,0 ] =>0, [ 2, 1] =>0, [ 2,6 ] =>0, [ 2, 7] =>0, 46 | [ 3,0 ] =>0, [ 3, 1] =>0, [ 3,6 ] =>0, [ 3, 7] =>0, 47 | [ 2,2 ] =>4, [ 2, 3] =>4, [ 2,8 ] =>4, [ 2, 9] =>4, 48 | [ 3,2 ] =>4, [ 3, 3] =>4, [ 3,8 ] =>4, [ 3, 9] =>4, 49 | [ 2,4 ]=>3, [ 2, 5 ]=>3, [ 2,10 ]=>3, [ 2, 11]=>3, 50 | [ 3,4 ]=>3, [ 3, 5 ]=>3, [ 3,10 ]=>3, [ 3, 11]=>3, 51 | 52 | [ 4,0 ] =>4, [ 4, 1] =>4, [ 4,6 ] =>4, [ 4, 7] =>4, 53 | [ 5,0 ] =>4, [ 5, 1] =>4, [ 5,6 ] =>4, [ 5, 7] =>4, 54 | [ 4,2 ] =>3, [ 4, 3] =>3, [ 4,8 ] =>3, [ 4, 9] =>3, 55 | [ 5,2 ] =>3, [ 5, 3] =>3, [ 5,8 ] =>3, [ 5, 9] =>3, 56 | [ 4,4 ]=>1, [ 4, 5 ]=>1, [ 4,10 ]=>1, [ 4, 11]=>1, 57 | [ 5,4 ]=>1, [ 5, 5 ]=>1, [ 5,10 ]=>1, [ 5, 11]=>1, 58 | 59 | [ 6,0 ] =>3, [ 6, 1] =>3, [ 6,6 ] =>3, [ 6, 7] =>3, 60 | [ 7,0 ] =>3, [ 7, 1] =>3, [ 7,6 ] =>3, [ 7, 7] =>3, 61 | [ 6,2 ] =>1, [ 6, 3] =>1, [ 6,8 ] =>1, [ 6, 9] =>1, 62 | [ 7,2 ] =>1, [ 7, 3] =>1, [ 7,8 ] =>1, [ 7, 9] =>1, 63 | [ 6,4 ]=>2, [ 6, 5 ]=>2, [ 6,10 ]=>2, [ 6, 11]=>2, 64 | [ 7,4 ]=>2, [ 7, 5 ]=>2, [ 7,10 ]=>2, [ 7, 11]=>2, 65 | 66 | [ 8,0 ] =>1, [ 8, 1] =>1, [ 8,6 ] =>1, [ 8, 7] =>1, 67 | [ 9,0 ] =>1, [ 9, 1] =>1, [ 9,6 ] =>1, [ 9, 7] =>1, 68 | [ 8,2 ] =>2, [ 8, 3] =>2, [ 8,8 ] =>2, [ 8, 9] =>2, 69 | [ 9,2 ] =>2, [ 9, 3] =>2, [ 9,8 ] =>2, [ 9, 9] =>2, 70 | [ 8,4 ]=>0, [ 8, 5 ]=>0, [ 8,10 ]=>0, [ 8, 11]=>0, 71 | [ 9,4 ]=>0, [ 9, 5 ]=>0, [ 9,10 ]=>0, [ 9, 11]=>0, 72 | 73 | } 74 | 75 | 76 | o["长生"] = [ 8, 11, 6, 2, 2 ] 77 | 78 | 79 | 80 | v["星"] = [ 81 | "紫微","天机","太阳","武曲","天同","廉贞", 82 | "天府","太阴","贪狼","巨门","天相","天梁","七杀","破军", 83 | "左辅","右弼","文曲","文昌","天魁","天钺","禄存", 84 | "擎羊","陀螺","火星","铃星","地空","地劫", 85 | "天马","红鸳","天喜","孤辰","寡宿","天刑","天姚","年解", 86 | "天官","天福","天厨","截路","空亡","解神","天巫","天月","阴煞","台辅","封诰", 87 | "天才","天寿","华盖","天空","天哭","天虚","咸池","龙池","凤阁","蜚廉","破碎", 88 | "三台","八座","恩光","天贵", 89 | "天殇","天使", 90 | "岁建","晦气","丧门","贯索","官符","小耗","大耗","龙德","白虎","天德","吊客","病符", 91 | "旬空", 92 | "流昌","流曲","流魁","流钺","流禄","流羊","流陀","流鸳","流喜", 93 | "运昌","运曲","运魁","运钺","运禄","运羊","运陀" 94 | ] 95 | 96 | 97 | xi = {} 98 | v["星"].each_index { |i| 99 | xi[v["星"][i]] = i 100 | } 101 | 102 | o["天府"] = [ 4, 3, 2, 1, 0, 11, 10, 9 , 8 ,7 , 6, 5 ] 103 | o["天魁"] = [ 1, 0, 11,11, 1,0, 1,6,5,5 ] 104 | o["天钺"] = [ 7, 8, 9, 9, 7,8, 7,2,3,3 ] 105 | o["禄存"] = [ 2, 3, 5, 6 ,5, 6, 8,9, 11, 0] 106 | 107 | 108 | 109 | v["十干四化"] = [ "禄","权","科","忌"] 110 | o["十干四化"] = [ 111 | [ "廉贞", "破军" ,"武曲","太阳" ], 112 | [ "天机", "天梁" ,"紫微","太阴" ], 113 | [ "天同", "天机" ,"文昌","廉贞" ], 114 | [ "太阴", "天同" ,"天机","巨门" ], 115 | [ "贪狼", "太阴" ,"右弼","天机" ], 116 | [ "武曲", "贪狼" ,"天梁","文曲" ], 117 | [ "太阳", "武曲" ,"天府","天同" ], 118 | [ "巨门", "太阳" ,"文曲","文昌" ], 119 | [ "天梁", "紫薇" ,"左辅","武曲" ], 120 | [ "破军", "巨门" ,"太阴","贪狼" ] 121 | ] 122 | 123 | 124 | o["地支庙陷"] = [ 125 | # 紫微 ,天机, 太阳, 武曲, 天同. 廉贞 126 | [ 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1 ], 127 | [ 1,-1, 2, 1, 2, 2, 1,-1, 2, 1, 2, 2 ], 128 | [-1,-1, 1, 1, 1, 1, 1, 2, 2, 2,-1,-1 ], 129 | [ 1, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2 ], 130 | [ 1,-1,2,2,2,1,-1,-1,1,2,2,1], 131 | [2,2,1,2,2,-1,2,2,1,2,2,-1], 132 | 133 | # 天府,太阴,贪狼, 巨门,天相,天梁, 七杀, 破军 134 | [1,1,1,2,1,2,1,1,2,1,1,2], 135 | [1,1,1,-1,-1,-1,-1,-1,2,1,1,1], 136 | [1,1,2,2,1,-1,1,1,2,2,1,-1], 137 | [1,-1,1,1,-1,1,1,-1,1,1,-1,1], 138 | [1,1,1,-1,2,2,1,2,1,-1,2,2], 139 | [1,1,1,1,1,-1,1,1,-1,2,1,-1], 140 | [1,1,1,1,1,2,1,1,1,1,1,2], 141 | [1,1,2,-1,1,2,1,1,2,-1,1,2], 142 | 143 | # 左辅, 右弼, 文曲, 文昌, 天魁, 天钺, 禄存 144 | [0,0,0,0,0,0,0,0,0,0,0,0], 145 | [0,0,0,0,0,0,0,0,0,0,0,0], 146 | [2,1,2,1,2,1,-1,1,2,1,-1,1], 147 | [2,1,-1,2,2,1,-1,2,2,1,-1,2], 148 | [0,0,0,0,0,0,0,0,0,0,0,0], 149 | [0,0,0,0,0,0,0,0,0,0,0,0], 150 | [1,0,1,1,0,1,1,0,1,1,0,1], 151 | 152 | # 擎羊,陀螺, 火星,铃星 ,地空,地劫 153 | [-1,1,0,-1,1,0,-1,1,0,-1,1,0], 154 | [0,1,-1,0,1,-1,0,1,-1,0,1,-1], 155 | [-1,2,1,2,-1,2,1,2,-1,2,1,2], 156 | [-1,2,1,2,-1,2,1,2,-1,2,1,2], 157 | [0,0,0,0,0,0,0,0,0,0,0,0], 158 | [0,0,0,0,0,0,0,0,0,0,0,0], 159 | 160 | # 天马, 红鸳, 天喜 , 孤辰 ,寡宿, 天刑, 天姚, 天德, 年解 161 | [0,0,0,0,0,0,0,0,0,0,0,0], 162 | [0,0,0,0,0,0,0,0,0,0,0,0], 163 | [0,0,0,0,0,0,0,0,0,0,0,0], 164 | [0,0,0,0,0,0,0,0,0,0,0,0], 165 | [0,0,0,0,0,0,0,0,0,0,0,0], 166 | [2,-1,1,1,2,2,2,-1,2,1,1,2], 167 | [2,-1,2,1,2,2,2,-1,2,1,1,1], 168 | [0,0,0,0,0,0,0,0,0,0,0,0], 169 | [0,0,0,0,0,0,0,0,0,0,0,0], 170 | 171 | ] 172 | 173 | 174 | 175 | 176 | nongli = CDate.new() 177 | 178 | 179 | # Born date 180 | dt = DateTime.parse( ARGV[0] ) 181 | nongdate = nongli.to_ccal( dt ) 182 | sizhu = nongli.bazi( dt ) 183 | 184 | # Today / User selected today date 185 | dt_today = ARGV[1] != nil ? DateTime.parse( ARGV[1] ) : DateTime.now() 186 | nongdate_today = nongli.to_ccal( dt_today) 187 | sizhu_today = nongli.bazi( dt_today ) 188 | 189 | # Gender 190 | gender = ARGV[2] != nil ? ["f","m"].index(ARGV[2]) : 1 191 | 192 | 193 | # 命宫,身宫 194 | minggong = (nongdate[:imonth] + 2 - sizhu[3][1]) % 12 195 | shengong = (nongdate[:imonth] + 2 + sizhu[3][1]) % 12 196 | 197 | 198 | #五局 199 | monthoff = [] 200 | monthoff[0] = o["五虎遁"][ sizhu[0][0] ] 201 | monthoff[1] = o["五虎遁"][ (sizhu[0][0] + 1) % 10 ] 202 | 203 | effective_monthoff = monthoff[ minggong < 2 ? 1 : 0 ] 204 | wuxingju = o["五行局"][[ (effective_monthoff + minggong - 2) % 10 ,minggong] ] 205 | 206 | 207 | 208 | 209 | # 14 主星 210 | # 紫薇 ,天机, 太阳, 武曲, 天同. 廉贞 211 | xp = [] 212 | lrxp = [] 213 | 214 | 215 | x = 0 216 | (0...6).each { |i| 217 | if ( nongdate[:iday] + 1 + i ) % ( wuxingju + 2 ) == 0 218 | x = i 219 | break 220 | end 221 | } 222 | y = (nongdate[:iday] + 1 + x) / ( wuxingju + 2 ) 223 | 224 | if x % 2 == 0 225 | xp[xi["紫微"]] = (y + 1 + x) % 12 226 | else 227 | xp[xi["紫微"]] = (y + 1 - x) % 12 228 | end 229 | 230 | 231 | xp[xi["天机"]] = (xp[xi["紫微"]] - 1) % 12 232 | xp[xi["太阳"]] = (xp[xi["紫微"]] - 3) % 12 233 | xp[xi["武曲"]] = (xp[xi["紫微"]] - 4) % 12 234 | xp[xi["天同"]] = (xp[xi["紫微"]] - 5) % 12 235 | xp[xi["廉贞"]] = (xp[xi["紫微"]] - 8) % 12 236 | 237 | # 天府,太阴,贪狼, 巨门,天相,天梁, 七杀, 破军 238 | xp[xi["天府"]] = o["天府"][xp[xi["紫微"]]] 239 | xp[xi["太阴"]] = (xp[xi["天府"]] + 1 ) % 12 240 | xp[xi["贪狼"]] = (xp[xi["天府"]] + 2 ) % 12 241 | xp[xi["巨门"]] = (xp[xi["天府"]] + 3 ) % 12 242 | xp[xi["天相"]] = (xp[xi["天府"]] + 4 ) % 12 243 | xp[xi["天梁"]] = (xp[xi["天府"]] + 5 ) % 12 244 | xp[xi["七杀"]] = (xp[xi["天府"]] + 6 ) % 12 245 | xp[xi["破军"]] = (xp[xi["天府"]] + 10 ) % 12 246 | 247 | 248 | # 13 吉凶星 249 | # 7 吉星 250 | # 左辅, 右弼, 文曲, 文昌, 天魁, 天钺, 禄存 251 | xp[xi["左辅"]] = (4 + nongdate[:imonth]) % 12 252 | xp[xi["右弼"]] = (10 - nongdate[:imonth]) % 12 253 | xp[xi["文曲"]] = (4 + sizhu[3][1] ) % 12 254 | xp[xi["文昌"]] = (10 - sizhu[3][1]) % 12 255 | xp[xi["天魁"]] = o["天魁"][sizhu[0][0]] 256 | xp[xi["天钺"]] = o["天钺"][sizhu[0][0]] 257 | xp[xi["禄存"]] = o["禄存"][sizhu[0][0]] 258 | 259 | # 6 凶星 260 | # 擎羊,陀螺, 火星,铃星 ,地空,地劫 261 | xp[xi["擎羊"]] = (xp[xi["禄存"]] + 1) % 12 262 | xp[xi["陀螺"]] = (xp[xi["禄存"]] - 1) % 12 263 | xp[xi["火星"]] = ([ 2, 3,1, 9, 2, 3,1, 9, 2, 3,1, 9 ][sizhu[0][1]] + sizhu[3][1]) % 12 264 | xp[xi["铃星"]] = ([ 10,10,3,10, 10,10,3,10, 10,10,3,10 ][sizhu[0][1]] + sizhu[3][1]) % 12 265 | xp[xi["地空"]] = (11 - sizhu[3][1]) % 12 266 | xp[xi["地劫"]] = (11 + sizhu[3][1]) % 12 267 | 268 | 269 | # 杂耀星 270 | # 天马, 红鸳, 天喜 , 孤辰 ,寡宿, 天刑, 天姚, 天德, 年解 271 | xp[xi["天马"]] = [ 2,11,8,5, 2,11,8,5, 2,11,8,5 ][sizhu[0][1]] 272 | xp[xi["红鸳"]] = (3 - sizhu[0][1]) % 12 273 | xp[xi["天喜"]] = (xp[xi["红鸳"]] + 6) % 12 274 | 275 | 276 | xp[xi["孤辰"]] = [2,2,5,5,5,8,8,8,11,11,11,2][sizhu[0][1]] 277 | xp[xi["寡宿"]] = [10,10,1,1,1,4,4,4,7,7,7,10][sizhu[0][1]] 278 | 279 | 280 | xp[xi["天刑"]] = (9 + nongdate[:imonth]) % 12 281 | xp[xi["天姚"]] = (1 + nongdate[:imonth]) % 12 282 | xp[xi["年解"]] = (10 - sizhu[0][1]) % 12 283 | 284 | # "天官","天福","天厨","截路","空亡" 285 | xp[xi["天官"]] = [7,4,5,2,3,9,11,9,10,6][sizhu[0][0]] 286 | xp[xi["天福"]] = [9,8,0,11,3,2,6,5,6,5][sizhu[0][0]] 287 | xp[xi["天厨"]] = [5,6,0,5,6,8,2,6,9,11][sizhu[0][0]] 288 | xp[xi["截路"]] = [8,6,4,2,0,8,6,4,2,0][sizhu[0][0]] 289 | xp[xi["空亡"]] = [9,7,5,3,1,9,7,5,3,1][sizhu[0][0]] 290 | 291 | # "天巫","天月","阴煞","解神", 292 | xp[xi["天巫"]] = [5,8,2,11,5,8,2,11,5,8,2,11][nongdate[:imonth]] 293 | xp[xi["天月"]] = [10,5,4,2,7,3, 11, 7,2,6,10,2][nongdate[:imonth]] 294 | xp[xi["阴煞"]] = [2,0,10,8,6,4, 2, 0, 10,8,6,4][nongdate[:imonth]] 295 | xp[xi["解神"]] = [8,8,10,10,0,0,2,2,4,4,6,6][nongdate[:imonth]] 296 | 297 | 298 | #"台辅","封诰" 299 | xp[xi["台辅"]] = [6,7,8,9,10,11,0,1,2,3,4,5][sizhu[3][1]] 300 | xp[xi["封诰"]] = [2,3,4,5,6,7,8,9,10,11,0,1][sizhu[3][1]] 301 | 302 | #"天才","天寿","华盖","天空","天哭","天虚","咸池","龙池","凤阁","蜚廉","破碎", #56-66 303 | xp[xi["天才"]] = (minggong + sizhu[0][1]) % 12 304 | xp[xi["天寿"]] = (shengong + sizhu[0][1]) % 12 305 | xp[xi["华盖"]] = [4,1, 10,7, 4,1,10,7, 4,1,10,7][sizhu[0][1]] 306 | xp[xi["天空"]] = [1,2,3,4,5,6,7,8,9,10,11,0][sizhu[0][1]] 307 | xp[xi["天哭"]] = [6,5,4,3,2,1,0,11,10,9,8,7][sizhu[0][1]] 308 | xp[xi["天虚"]] = [6,7,8,9,10,11,0,1,2,3,4,5][sizhu[0][1]] 309 | xp[xi["咸池"]] = [9,6,3,0,9,6,3,0,9,6,3,0][sizhu[0][1]] 310 | xp[xi["龙池"]] = [4,5,6,7,8,9,10,11,0,1,2,3][sizhu[0][1]] 311 | xp[xi["凤阁"]] = [10,9,8,7,6,5,4,3,2,1,0,11][sizhu[0][1]] 312 | xp[xi["蜚廉"]] = [8,9,10,5,6,7,2,3,4,0,1,2][sizhu[0][1]] 313 | xp[xi["破碎"]] = [5,1,9,5,1,9,5,1,9,5,1,9][sizhu[0][1]] 314 | 315 | #"三台","八座","恩光","天贵" #67-70 316 | xp[xi["三台"]] = ( xp[xi["左辅"]] + nongdate[:iday]) % 12 317 | xp[xi["八座"]] = ( xp[xi["右弼"]] - nongdate[:iday]) % 12 318 | xp[xi["恩光"]] = ( xp[xi["文昌"]] + nongdate[:iday] - 1) % 12 319 | xp[xi["天贵"]] = ( xp[xi["文曲"]] + nongdate[:iday] - 1) % 12 320 | 321 | #"天殇","天使" 322 | xp[xi["天殇"]] = (minggong + 5) % 12 323 | xp[xi["天使"]] = (minggong + 7) % 12 324 | 325 | # "岁建","晦气","丧门","贯索","官符","小耗","大耗","龙德","白虎","天德", "吊客",病符 #73-82,84 326 | #xp[xi["岁建"]] = sizhu_today[0][1] 327 | #xp[xi["晦气"]] = (sizhu_today[0][1] + 1) % 12 328 | #xp[xi["丧门"]] = (sizhu_today[0][1] + 2) % 12 329 | #xp[xi["贯索"]] = (sizhu_today[0][1] + 3) % 12 330 | #xp[xi["官符"]] = (sizhu_today[0][1] + 4) % 12 331 | #xp[xi["小耗"]] = (sizhu_today[0][1] + 5) % 12 332 | 333 | xp[xi["大耗"]] = [7,6,9,8,11,10,1,0,3,2,5,4][sizhu[0][1]] 334 | 335 | #xp[xi["龙德"]] = (sizhu_today[0][1] + 7) % 12 336 | #xp[xi["白虎"]] = (sizhu_today[0][1] + 8) % 12 337 | xp[xi["天德"]] = (sizhu[0][1] + 9) % 12 338 | #xp[xi["吊客"]] = (sizhu_today[0][1] + 10) % 12 339 | #xp[xi["病符"]] = (sizhu_today[0][1] + 11) % 12 340 | 341 | xp[xi["旬空"]] = [ 10, 10, 0, 0 ,2, 2, 4, 4,6, 6,8,8 ] [ (sizhu[0][1] - sizhu[0][0]) % 12 ] 342 | 343 | 344 | 345 | 346 | #-------------- 347 | # General info 348 | age = (dt_today.year - dt.year + 1 ) 349 | 350 | puts "" 351 | print ["阳","阴"][sizhu[0][0] % 2 ],["女","男"][gender],"\n" 352 | printf "%d岁\n", age 353 | print v["五行局"][ wuxingju],"局","\n" 354 | print "命宫:",v["地支"][minggong],"\n" 355 | print "身宫:",v["地支"][shengong],"\n" 356 | 357 | changshen_off = o["长生"][wuxingju] 358 | 359 | 360 | #------------------------ 361 | #先天盘 362 | sihua = o["十干四化"][ sizhu[0][0] ] 363 | print12gong( wuxingju, minggong , "先天盘" , nongdate , sizhu , v , monthoff , xp, xi , changshen_off, o, sihua ) 364 | 365 | #-------------------- 366 | # 大限盘 367 | 368 | 369 | if ( age >= wuxingju + 2 ) 370 | 371 | dx_gong_offset = (age - wuxingju - 2) / 10 372 | dx_gong = minggong + dx_gong_offset 373 | 374 | effective_monthoff = monthoff[ dx_gong < 2 ? 1 : 0 ] 375 | dx_gan = (effective_monthoff + dx_gong - 2) % 10 376 | 377 | xp[xi["运昌"]] = (10 - dx_gong ) % 12 378 | xp[xi["运曲"]] = (4 + dx_gong ) % 12 379 | xp[xi["运钺"]] = o["天钺"][ dx_gan ] 380 | xp[xi["运魁"]] = o["天魁"][ dx_gan ] 381 | xp[xi["运禄"]] = o["禄存"][ dx_gan ] 382 | xp[xi["运羊"]] = (xp[xi["运禄"]] + 1) % 12 383 | xp[xi["运陀"]] = (xp[xi["运禄"]] - 1) % 12 384 | 385 | 386 | sihua_dx = o["十干四化"][ dx_gan ] 387 | print12gong( wuxingju, dx_gong , "大限盘" , nongdate_today , sizhu_today , v , monthoff , xp, xi , nil, o, sihua_dx ) 388 | 389 | (xi["运昌"]..xi["运陀"]).each { 390 | |x_id| 391 | xp[x_id] = nil 392 | } 393 | 394 | 395 | end 396 | 397 | 398 | #-------------------- 399 | # 流年 400 | 401 | 402 | 403 | lnminggong = sizhu_today[0][1] 404 | sihua_ln = o["十干四化"][ sizhu_today[0][0] ] 405 | 406 | print12gong( wuxingju, lnminggong , "流年盘" , nongdate_today , sizhu_today , v , monthoff , xp , xi , nil, o, sihua_ln ) 407 | 408 | 409 | #----------- 410 | #-流月 411 | doujun = (lnminggong - nongdate[:imonth] + sizhu[3][1]) % 12 412 | lyminggong = (nongdate_today[:imonth] + doujun) % 12 413 | sihua_ly = o["十干四化"][ sizhu_today[1][0] ] 414 | 415 | 416 | print12gong( wuxingju, lyminggong , "流月盘" , nongdate_today , sizhu_today , v , monthoff , xp , xi , nil, o, sihua_ly ) 417 | 418 | #----------------- 419 | # 流日 420 | 421 | 422 | xp[xi["流昌"]] = (5 + sizhu_today[2][0] ) % 12 423 | xp[xi["流曲"]] = (9 - sizhu_today[2][0] ) % 12 424 | 425 | xp[xi["流钺"]] = o["天魁"][ sizhu_today[0][0]] 426 | xp[xi["流魁"]] = o["天钺"][ sizhu_today[0][0]] 427 | 428 | xp[xi["流鸳"]] = (3 - sizhu_today[0][1]) % 12 429 | xp[xi["流喜"]] = (xp[xi["流鸳"]] + 6) % 12 430 | xp[xi["流禄"]] = o["禄存"][sizhu_today[0][0]] 431 | xp[xi["流羊"]] = (xp[xi["流禄"]] + 1) % 12 432 | xp[xi["流陀"]] = (xp[xi["流禄"]] - 1) % 12 433 | 434 | sihua_lr = o["十干四化"][ sizhu_today[2][0] ] 435 | lrminggong = (lyminggong + nongdate_today[:iday]) % 12 436 | print12gong( wuxingju, lrminggong , "流日盘" , nongdate_today , sizhu_today , v , monthoff , xp , xi , nil, o, sihua_lr ) 437 | 438 | 439 | #-------------------- 440 | #流时 441 | 442 | lsminggong = ( lrminggong + sizhu_today[3][1] ) % 12 443 | sihua_ls = o["十干四化"][ sizhu_today[3][0] ] 444 | print12gong( wuxingju, lsminggong , "流时盘" , nongdate_today , sizhu_today , v , monthoff , xp , xi , nil, o, sihua_ls ) 445 | 446 | 447 | 448 | end 449 | 450 | 451 | #----------------------- 452 | def horizontalline 453 | puts "\n\n" 454 | print "-" * 80 455 | puts "\n\n" 456 | end 457 | 458 | #----------------------- 459 | def print12gong( wuxingju, mg, title , nd , sz , v , monthoff , lrxp , xi , cs , o , sihua ) 460 | 461 | 462 | horizontalline 463 | 464 | puts title 465 | puts "#{ nd[:cmonth] }月 #{ nd[:cday]}" 466 | (0...4).each { |i| 467 | print "#{v["天干"][sz[i][0]]}#{v["地支"][sz[i][1]]} " 468 | } 469 | puts "\n\n" 470 | (0...12).each do |i| 471 | 472 | effective_monthoff = monthoff[ i < 2 ? 1 : 0 ] 473 | gan = (effective_monthoff + i - 2) % 10 474 | 475 | print v["天干"][gan],v["地支"][i]," " 476 | print v["十二宫"][ (12 - (i - mg )) % 12] 477 | print "\t" 478 | print " ",v["长生"][ (i - cs) % 12 ],"\t" if cs != nil 479 | 480 | if title == "先天盘" 481 | agebegin = ((i - mg) % 12) * 10 + (wuxingju + 2) 482 | printf "%d-%d", agebegin,agebegin + 10 - 1 483 | print "\t" 484 | end 485 | 486 | xi.values.each { |xid| 487 | 488 | if lrxp != nil && lrxp[xid] == i 489 | 490 | sihua_text = "" 491 | (0...4).each { |sihua_i| 492 | if xi[sihua[sihua_i]] == xid 493 | sihua_text = v["十干四化"][sihua_i] 494 | end 495 | } 496 | 497 | print v["星"][xid] 498 | 499 | if xid < 36 500 | print ["陷","","平","旺"][ o["地支庙陷"][xid][ i ] + 1 ] 501 | print sihua_text.length > 0 ? "(#{sihua_text})" : "" 502 | end 503 | print " " 504 | end 505 | } 506 | 507 | puts "" 508 | end 509 | 510 | end 511 | 512 | main 513 | -------------------------------------------------------------------------------- /goleph.rb: -------------------------------------------------------------------------------- 1 | # coding: UTF-8 2 | 3 | module CCal 4 | # 移植自“寿星天文历”的函数都包括于此模块 5 | module GolEph 6 | module_function 7 | # eph0.js begin 8 | 9 | # 2000-1-1的儒略日数值 10 | J2000 = 2451545.0 11 | 12 | ## 每弧度的角秒数 13 | RAD = 180*3600/Math::PI 14 | 15 | ## TD - UT1 计算表 [世界时与原子时之差] 16 | DT_AT = [ 17 | -4000.0, 108371.7, -13036.80, 392.000, 0.0000, 18 | -500.0, 17201.0, -627.82, 16.170, -0.3413, 19 | -150.0, 12200.6, -346.41, 5.403, -0.1593, 20 | 150.0, 9113.8, -328.13, -1.647, 0.0377, 21 | 500.0, 5707.5, -391.41, 0.915, 0.3145, 22 | 900.0, 2203.4, -283.45, 13.034, -0.1778, 23 | 1300.0, 490.1, -57.35, 2.085, -0.0072, 24 | 1600.0, 120.0, -9.81, -1.532, 0.1403, 25 | 1700.0, 10.2, -0.91, 0.510, -0.0370, 26 | 1800.0, 13.4, -0.72, 0.202, -0.0193, 27 | 1830.0, 7.8, -1.81, 0.416, -0.0247, 28 | 1860.0, 8.3, -0.13, -0.406, 0.0292, 29 | 1880.0, -5.4, 0.32, -0.183, 0.0173, 30 | 1900.0, -2.3, 2.06, 0.169, -0.0135, 31 | 1920.0, 21.2, 1.69, -0.304, 0.0167, 32 | 1940.0, 24.2, 1.22, -0.064, 0.0031, 33 | 1960.0, 33.2, 0.51, 0.231, -0.0109, 34 | 1980.0, 51.0, 1.29, -0.026, 0.0032, 35 | 2000.0, 63.87, 0.1, 0.0, 0.0, 36 | 2005.0, 64.7, 0.4, 0.0, 0.0, ## 一次项记为x, 则 10x=0.4秒/年*(2015-2005), 解得x=0.4 37 | 2015.0, 69.0 38 | ] 39 | 40 | ## 地球星历数据表,及数据表的计算 41 | #-- 42 | # 原程序中是8行星星历数据表,不过只用到了地球的数据,故其他7行星的数据未包含 43 | #++ 44 | XL0 = [ 45 | ## Dear精度:J2000+-4千年 黄经0.1角秒 黄纬0.1角秒 距离0.1AU/10^6 46 | [ 47 | 10000000000.0,## A的倍率 48 | 20.0,578.0,920.0,1100.0,1124.0,1136.0,1148.0,1217.0,1226.0,1229.0,1229.0,1229.0,1229.0,1937.0,2363.0,2618.0,2633.0,2660.0,2666.0,## 位置索引表 49 | ## L0 50 | 17534704567.0,0.00000000000,0.00000000000,334165646.0,4.669256804,6283.075849991,3489428.0,4.6261024,12566.1517000,349706.0,2.744118,5753.384885,341757.0,2.828866,3.523118,313590.0,3.627670,77713.771468,267622.0,4.418084,7860.419392,234269.0,6.135162,3930.209696,132429.0,0.742464,11506.769770,127317.0,2.037097,529.690965,119917.0,1.109629,1577.343542,99025.0,5.23268,5884.92685,90186.0,2.04505,26.29832,85722.0,3.50849,398.14900,77979.0,1.17883,5223.69392,75314.0,2.53339,5507.55324,50526.0,4.58293,18849.22755,49238.0,4.20507,775.52261,35666.0,2.91954,0.06731,31709.0,5.84902,11790.62909,28413.0,1.89869,796.29801,27104.0,0.31489,10977.07880,24281.0,0.34481,5486.77784,20616.0,4.80647,2544.31442,20539.0,1.86948,5573.14280,20226.0,2.45768,6069.77675,15552.0,0.83306,213.29910,13221.0,3.41118,2942.46342,12618.0,1.08303,20.77540,11513.0,0.64545,0.98032,10285.0,0.63600,4694.00295,10190.0,0.97569,15720.83878,10172.0,4.26680,7.11355,9921.0,6.2099,2146.1654,9761.0,0.6810,155.4204,8580.0,5.9832,161000.6857,8513.0,1.2987,6275.9623,8471.0,3.6708,71430.6956,7964.0,1.8079,17260.1547,7876.0,3.0370,12036.4607,7465.0,1.7551,5088.6288,7387.0,3.5032,3154.6871,7355.0,4.6793,801.8209,6963.0,0.8330,9437.7629,6245.0,3.9776,8827.3903,6115.0,1.8184,7084.8968,5696.0,2.7843,6286.5990,5612.0,4.3869,14143.4952,5558.0,3.4701,6279.5527,5199.0,0.1891,12139.5535,5161.0,1.3328,1748.0164,5115.0,0.2831,5856.4777,4900.0,0.4874,1194.4470,4104.0,5.3682,8429.2413,4094.0,2.3985,19651.0485,3920.0,6.1683,10447.3878,3677.0,6.0413,10213.2855,3660.0,2.5696,1059.3819,3595.0,1.7088,2352.8662,3557.0,1.7760,6812.7668,3329.0,0.5931,17789.8456,3041.0,0.4429,83996.8473,3005.0,2.7398,1349.8674,2535.0,3.1647,4690.4798,2474.0,0.2148,3.5904,2366.0,0.4847,8031.0923,2357.0,2.0653,3340.6124,2282.0,5.2220,4705.7323,2189.0,5.5559,553.5694,2142.0,1.4256,16730.4637,2109.0,4.1483,951.7184,2030.0,0.3713,283.8593,1992.0,5.2221,12168.0027,1986.0,5.7747,6309.3742,1912.0,3.8222,23581.2582,1889.0,5.3863,149854.4001,1790.0,2.2149,13367.9726,1748.0,4.5605,135.0651,1622.0,5.9884,11769.8537,1508.0,4.1957,6256.7775,1442.0,4.1932,242.7286,1435.0,3.7236,38.0277,1397.0,4.4014,6681.2249,1362.0,1.8893,7632.9433,1250.0,1.1305,5.5229,1205.0,2.6223,955.5997,1200.0,1.0035,632.7837,1129.0,0.1774,4164.3120,1083.0,0.3273,103.0928,1052.0,0.9387,11926.2544,1050.0,5.3591,1592.5960,1033.0,6.1998,6438.4962,1001.0,6.0291,5746.2713,980.0,0.999,11371.705,980.0,5.244,27511.468,938.0,2.624,5760.498,923.0,0.483,522.577,922.0,4.571,4292.331,905.0,5.337,6386.169,862.0,4.165,7058.598,841.0,3.299,7234.794,836.0,4.539,25132.303,813.0,6.112,4732.031,812.0,6.271,426.598,801.0,5.821,28.449,787.0,0.996,5643.179,776.0,2.957,23013.540,769.0,3.121,7238.676,758.0,3.974,11499.656,735.0,4.386,316.392,731.0,0.607,11513.883,719.0,3.998,74.782,706.0,0.323,263.084,676.0,5.911,90955.552,663.0,3.665,17298.182,653.0,5.791,18073.705,630.0,4.717,6836.645,615.0,1.458,233141.314,612.0,1.075,19804.827,596.0,3.321,6283.009,596.0,2.876,6283.143,555.0,2.452,12352.853,541.0,5.392,419.485,531.0,0.382,31441.678,519.0,4.065,6208.294,513.0,2.361,10973.556,494.0,5.737,9917.697,450.0,3.272,11015.106,449.0,3.653,206.186,447.0,2.064,7079.374,435.0,4.423,5216.580,421.0,1.906,245.832,413.0,0.921,3738.761,402.0,0.840,20.355,387.0,1.826,11856.219,379.0,2.344,3.881,374.0,2.954,3128.389,370.0,5.031,536.805,365.0,1.018,16200.773,365.0,1.083,88860.057,352.0,5.978,3894.182,352.0,2.056,244287.600,351.0,3.713,6290.189,340.0,1.106,14712.317,339.0,0.978,8635.942,339.0,3.202,5120.601,333.0,0.837,6496.375,325.0,3.479,6133.513,316.0,5.089,21228.392,316.0,1.328,10873.986,309.0,3.646,10.637,303.0,1.802,35371.887,296.0,3.397,9225.539,288.0,6.026,154717.610,281.0,2.585,14314.168,262.0,3.856,266.607,262.0,2.579,22483.849,257.0,1.561,23543.231,255.0,3.949,1990.745,251.0,3.744,10575.407,240.0,1.161,10984.192,238.0,0.106,7.046,236.0,4.272,6040.347,234.0,3.577,10969.965,211.0,3.714,65147.620,210.0,0.754,13521.751,207.0,4.228,5650.292,202.0,0.814,170.673,201.0,4.629,6037.244,200.0,0.381,6172.870,199.0,3.933,6206.810,199.0,5.197,6262.300,197.0,1.046,18209.330,195.0,1.070,5230.807,195.0,4.869,36.028,194.0,4.313,6244.943,192.0,1.229,709.933,192.0,5.595,6282.096,192.0,0.602,6284.056,189.0,3.744,23.878,188.0,1.904,15.252,188.0,0.867,22003.915,182.0,3.681,15110.466,181.0,0.491,1.484,179.0,3.222,39302.097,179.0,1.259,12559.038, 51 | ## L1 52 | 62833196674749.0,0.000000000000,0.000000000000,20605886.0,2.67823456,6283.07584999,430343.0,2.635127,12566.151700,42526.0,1.59047,3.52312,11926.0,5.79557,26.29832,10898.0,2.96618,1577.34354,9348.0,2.5921,18849.2275,7212.0,1.1385,529.6910,6777.0,1.8747,398.1490,6733.0,4.4092,5507.5532,5903.0,2.8880,5223.6939,5598.0,2.1747,155.4204,4541.0,0.3980,796.2980,3637.0,0.4662,775.5226,2896.0,2.6471,7.1135,2084.0,5.3414,0.9803,1910.0,1.8463,5486.7778,1851.0,4.9686,213.2991,1729.0,2.9912,6275.9623,1623.0,0.0322,2544.3144,1583.0,1.4305,2146.1654,1462.0,1.2053,10977.0788,1246.0,2.8343,1748.0164,1188.0,3.2580,5088.6288,1181.0,5.2738,1194.4470,1151.0,2.0750,4694.0030,1064.0,0.7661,553.5694,997.0,1.303,6286.599,972.0,4.239,1349.867,945.0,2.700,242.729,858.0,5.645,951.718,758.0,5.301,2352.866,639.0,2.650,9437.763,610.0,4.666,4690.480,583.0,1.766,1059.382,531.0,0.909,3154.687,522.0,5.661,71430.696,520.0,1.854,801.821,504.0,1.425,6438.496,433.0,0.241,6812.767,426.0,0.774,10447.388,413.0,5.240,7084.897,374.0,2.001,8031.092,356.0,2.429,14143.495,350.0,4.800,6279.553,337.0,0.888,12036.461,337.0,3.862,1592.596,325.0,3.400,7632.943,322.0,0.616,8429.241,318.0,3.188,4705.732,297.0,6.070,4292.331,295.0,1.431,5746.271,290.0,2.325,20.355,275.0,0.935,5760.498,270.0,4.804,7234.794,253.0,6.223,6836.645,228.0,5.003,17789.846,225.0,5.672,11499.656,215.0,5.202,11513.883,208.0,3.955,10213.286,208.0,2.268,522.577,206.0,2.224,5856.478,206.0,2.550,25132.303,203.0,0.910,6256.778,189.0,0.532,3340.612,188.0,4.735,83996.847,179.0,1.474,4164.312,178.0,3.025,5.523,177.0,3.026,5753.385,159.0,4.637,3.286,157.0,6.124,5216.580,155.0,3.077,6681.225,154.0,4.200,13367.973,143.0,1.191,3894.182,138.0,3.093,135.065,136.0,4.245,426.598,134.0,5.765,6040.347,128.0,3.085,5643.179,127.0,2.092,6290.189,125.0,3.077,11926.254,125.0,3.445,536.805,114.0,3.244,12168.003,112.0,2.318,16730.464,111.0,3.901,11506.770,111.0,5.320,23.878,105.0,3.750,7860.419,103.0,2.447,1990.745,96.0,0.82,3.88,96.0,4.08,6127.66,91.0,5.42,206.19,91.0,0.42,7079.37,88.0,5.17,11790.63,81.0,0.34,9917.70,80.0,3.89,10973.56,78.0,2.40,1589.07,78.0,2.58,11371.70,77.0,3.98,955.60,77.0,3.36,36.03,76.0,1.30,103.09,75.0,5.18,10969.97,75.0,4.96,6496.37,73.0,5.21,38.03,72.0,2.65,6309.37,70.0,5.61,3738.76,69.0,2.60,3496.03,69.0,0.39,15.25,69.0,2.78,20.78,65.0,1.13,7058.60,64.0,4.28,28.45,61.0,5.63,10984.19,60.0,0.73,419.48,60.0,5.28,10575.41,58.0,5.55,17298.18,58.0,3.19,4732.03, 53 | ## L2 54 | 5291887.0,0.0000000,0.0000000,871984.0,1.072097,6283.075850,30913.0,0.86729,12566.15170,2734.0,0.0530,3.5231,1633.0,5.1883,26.2983,1575.0,3.6846,155.4204,954.0,0.757,18849.228,894.0,2.057,77713.771,695.0,0.827,775.523,506.0,4.663,1577.344,406.0,1.031,7.114,381.0,3.441,5573.143,346.0,5.141,796.298,317.0,6.053,5507.553,302.0,1.192,242.729,289.0,6.117,529.691,271.0,0.306,398.149,254.0,2.280,553.569,237.0,4.381,5223.694,208.0,3.754,0.980,168.0,0.902,951.718,153.0,5.759,1349.867,145.0,4.364,1748.016,134.0,3.721,1194.447,125.0,2.948,6438.496,122.0,2.973,2146.165,110.0,1.271,161000.686,104.0,0.604,3154.687,100.0,5.986,6286.599,92.0,4.80,5088.63,89.0,5.23,7084.90,83.0,3.31,213.30,76.0,3.42,5486.78,71.0,6.19,4690.48,68.0,3.43,4694.00,65.0,1.60,2544.31,64.0,1.98,801.82,61.0,2.48,10977.08,50.0,1.44,6836.65,49.0,2.34,1592.60,46.0,1.31,4292.33,46.0,3.81,149854.40,43.0,0.04,7234.79,40.0,4.94,7632.94,39.0,1.57,71430.70,38.0,3.17,6309.37,35.0,0.99,6040.35,35.0,0.67,1059.38,31.0,3.18,2352.87,31.0,3.55,8031.09,30.0,1.92,10447.39,30.0,2.52,6127.66,28.0,4.42,9437.76,28.0,2.71,3894.18,27.0,0.67,25132.30,26.0,5.27,6812.77,25.0,0.55,6279.55,23.0,1.38,4705.73,22.0,0.64,6256.78,20.0,6.07,640.88, 55 | ## L3 56 | 28923.0,5.84384,6283.07585,3496.0,0.0000,0.0000,1682.0,5.4877,12566.1517,296.0,5.196,155.420,129.0,4.722,3.523,71.0,5.30,18849.23,64.0,5.97,242.73,40.0,3.79,553.57, 57 | ## L4 58 | 11408.0,3.14159,0.00000,772.0,4.134,6283.076,77.0,3.84,12566.15,42.0,0.42,155.42, 59 | ## L5 60 | 88.0,3.14,0.00,17.0,2.77,6283.08,5.0,2.01,155.42,3.0,2.21,12566.15, 61 | ## B0 62 | 27962.0,3.19870,84334.66158,10164.0,5.42249,5507.55324,8045.0,3.8801,5223.6939,4381.0,3.7044,2352.8662,3193.0,4.0003,1577.3435,2272.0,3.9847,1047.7473,1814.0,4.9837,6283.0758,1639.0,3.5646,5856.4777,1444.0,3.7028,9437.7629,1430.0,3.4112,10213.2855,1125.0,4.8282,14143.4952,1090.0,2.0857,6812.7668,1037.0,4.0566,71092.8814,971.0,3.473,4694.003,915.0,1.142,6620.890,878.0,4.440,5753.385,837.0,4.993,7084.897,770.0,5.554,167621.576,719.0,3.602,529.691,692.0,4.326,6275.962,558.0,4.410,7860.419,529.0,2.484,4705.732,521.0,6.250,18073.705, 63 | ## B1 64 | 903.0,3.897,5507.553,618.0,1.730,5223.694,380.0,5.244,2352.866, 65 | ## B2 66 | 166.0,1.627,84334.662, 67 | ## R0 68 | 10001398880.0,0.00000000000,0.00000000000,167069963.0,3.098463508,6283.075849991,1395602.0,3.0552461,12566.1517000,308372.0,5.198467,77713.771468,162846.0,1.173877,5753.384885,157557.0,2.846852,7860.419392,92480.0,5.45292,11506.76977,54244.0,4.56409,3930.20970,47211.0,3.66100,5884.92685,34598.0,0.96369,5507.55324,32878.0,5.89984,5223.69392,30678.0,0.29867,5573.14280,24319.0,4.27350,11790.62909,21183.0,5.84715,1577.34354,18575.0,5.02194,10977.07880,17484.0,3.01194,18849.22755,10984.0,5.05511,5486.77784,9832.0,0.8868,6069.7768,8650.0,5.6896,15720.8388,8583.0,1.2708,161000.6857,6490.0,0.2725,17260.1547,6292.0,0.9218,529.6910,5706.0,2.0137,83996.8473,5574.0,5.2416,71430.6956,4938.0,3.2450,2544.3144,4696.0,2.5781,775.5226,4466.0,5.5372,9437.7629,4252.0,6.0111,6275.9623,3897.0,5.3607,4694.0030,3825.0,2.3926,8827.3903,3749.0,0.8295,19651.0485,3696.0,4.9011,12139.5535,3566.0,1.6747,12036.4607,3454.0,1.8427,2942.4634,3319.0,0.2437,7084.8968,3192.0,0.1837,5088.6288,3185.0,1.7778,398.1490,2846.0,1.2134,6286.5990,2779.0,1.8993,6279.5527,2628.0,4.5890,10447.3878,2460.0,3.7866,8429.2413,2393.0,4.9960,5856.4777,2359.0,0.2687,796.2980,2329.0,2.8078,14143.4952,2210.0,1.9500,3154.6871,2035.0,4.6527,2146.1654,1951.0,5.3823,2352.8662,1883.0,0.6731,149854.4001,1833.0,2.2535,23581.2582,1796.0,0.1987,6812.7668,1731.0,6.1520,16730.4637,1717.0,4.4332,10213.2855,1619.0,5.2316,17789.8456,1381.0,5.1896,8031.0923,1364.0,3.6852,4705.7323,1314.0,0.6529,13367.9726,1041.0,4.3329,11769.8537,1017.0,1.5939,4690.4798,998.0,4.201,6309.374,966.0,3.676,27511.468,874.0,6.064,1748.016,779.0,3.674,12168.003,771.0,0.312,7632.943,756.0,2.626,6256.778,746.0,5.648,11926.254,693.0,2.924,6681.225,680.0,1.423,23013.540,674.0,0.563,3340.612,663.0,5.661,11371.705,659.0,3.136,801.821,648.0,2.650,19804.827,615.0,3.029,233141.314,612.0,5.134,1194.447,563.0,4.341,90955.552,552.0,2.091,17298.182,534.0,5.100,31441.678,531.0,2.407,11499.656,523.0,4.624,6438.496,513.0,5.324,11513.883,477.0,0.256,11856.219,461.0,1.722,7234.794,458.0,3.766,6386.169,458.0,4.466,5746.271,423.0,1.055,5760.498,422.0,1.557,7238.676,415.0,2.599,7058.598,401.0,3.030,1059.382,397.0,1.201,1349.867,379.0,4.907,4164.312,360.0,5.707,5643.179,352.0,3.626,244287.600,348.0,0.761,10973.556,342.0,3.001,4292.331,336.0,4.546,4732.031,334.0,3.138,6836.645,324.0,4.164,9917.697,316.0,1.691,11015.106,307.0,0.238,35371.887,298.0,1.306,6283.143,298.0,1.750,6283.009,293.0,5.738,16200.773,286.0,5.928,14712.317,281.0,3.515,21228.392,280.0,5.663,8635.942,277.0,0.513,26.298,268.0,4.207,18073.705,266.0,0.900,12352.853,260.0,2.962,25132.303,255.0,2.477,6208.294,242.0,2.800,709.933,231.0,1.054,22483.849,229.0,1.070,14314.168,216.0,1.314,154717.610,215.0,6.038,10873.986,200.0,0.561,7079.374,198.0,2.614,951.718,197.0,4.369,167283.762,186.0,2.861,5216.580,183.0,1.660,39302.097,183.0,5.912,3738.761,175.0,2.145,6290.189,173.0,2.168,10575.407,171.0,3.702,1592.596,171.0,1.343,3128.389,164.0,5.550,6496.375,164.0,5.856,10984.192,161.0,1.998,10969.965,161.0,1.909,6133.513,157.0,4.955,25158.602,154.0,6.216,23543.231,153.0,5.357,13521.751,150.0,5.770,18209.330,150.0,5.439,155.420,139.0,1.778,9225.539,139.0,1.626,5120.601,128.0,2.460,13916.019,123.0,0.717,143571.324,122.0,2.654,88860.057,121.0,4.414,3894.182,121.0,1.192,3.523,120.0,4.030,553.569,119.0,1.513,17654.781,117.0,3.117,14945.316,113.0,2.698,6040.347,110.0,3.085,43232.307,109.0,0.998,955.600,108.0,2.939,17256.632,107.0,5.285,65147.620,103.0,0.139,11712.955,103.0,5.850,213.299,102.0,3.046,6037.244,101.0,2.842,8662.240,100.0,3.626,6262.300,98.0,2.36,6206.81,98.0,5.11,6172.87,98.0,2.00,15110.47,97.0,2.67,5650.29,97.0,2.75,6244.94,96.0,4.02,6282.10,96.0,5.31,6284.06,92.0,0.10,29088.81,85.0,3.26,20426.57,84.0,2.60,28766.92,81.0,3.58,10177.26,80.0,5.81,5230.81,78.0,2.53,16496.36,77.0,4.06,6127.66,73.0,0.04,5481.25,72.0,5.96,12559.04,72.0,5.92,4136.91,71.0,5.49,22003.91,70.0,3.41,7.11,69.0,0.62,11403.68,69.0,3.90,1589.07,69.0,1.96,12416.59,69.0,4.51,426.60,67.0,1.61,11087.29,66.0,4.50,47162.52,66.0,5.08,283.86,66.0,4.32,16858.48,65.0,1.04,6062.66,64.0,1.59,18319.54,63.0,5.70,45892.73,63.0,4.60,66567.49,63.0,3.82,13517.87,62.0,2.62,11190.38,61.0,1.54,33019.02,60.0,5.58,10344.30,60.0,5.38,316428.23,60.0,5.78,632.78,59.0,6.12,9623.69,57.0,0.16,17267.27,57.0,3.86,6076.89,57.0,1.98,7668.64,56.0,4.78,20199.09,55.0,4.56,18875.53,55.0,3.51,17253.04,54.0,3.07,226858.24,54.0,4.83,18422.63,53.0,5.02,12132.44,52.0,3.63,5333.90,52.0,0.97,155427.54,51.0,3.36,20597.24,50.0,0.99,11609.86,50.0,2.21,1990.75,48.0,1.62,12146.67,48.0,1.17,12569.67,47.0,4.62,5436.99,47.0,1.81,12562.63,47.0,0.59,21954.16,47.0,0.76,7342.46,46.0,0.27,4590.91,46.0,3.77,156137.48,45.0,5.66,10454.50,44.0,5.84,3496.03,43.0,0.24,17996.03,41.0,5.93,51092.73,41.0,4.21,12592.45,40.0,5.14,1551.05,40.0,5.28,15671.08,39.0,3.69,18052.93,39.0,4.94,24356.78,38.0,2.72,11933.37,38.0,5.23,7477.52,38.0,4.99,9779.11,37.0,3.70,9388.01,37.0,4.44,4535.06,36.0,2.16,28237.23,36.0,2.54,242.73,36.0,0.22,5429.88,35.0,6.15,19800.95,35.0,2.92,36949.23,34.0,5.63,2379.16,34.0,5.73,16460.33,34.0,5.11,5849.36,33.0,6.19,6268.85, 69 | ## R1 70 | 10301861.0,1.10748970,6283.07584999,172124.0,1.064423,12566.151700,70222.0,3.14159,0.00000,3235.0,1.0217,18849.2275,3080.0,2.8435,5507.5532,2497.0,1.3191,5223.6939,1849.0,1.4243,1577.3435,1008.0,5.9138,10977.0788,865.0,1.420,6275.962,863.0,0.271,5486.778,507.0,1.686,5088.629,499.0,6.014,6286.599,467.0,5.987,529.691,440.0,0.518,4694.003,410.0,1.084,9437.763,387.0,4.750,2544.314,375.0,5.071,796.298,352.0,0.023,83996.847,344.0,0.949,71430.696,341.0,5.412,775.523,322.0,6.156,2146.165,286.0,5.484,10447.388,284.0,3.420,2352.866,255.0,6.132,6438.496,252.0,0.243,398.149,243.0,3.092,4690.480,225.0,3.689,7084.897,220.0,4.952,6812.767,219.0,0.420,8031.092,209.0,1.282,1748.016,193.0,5.314,8429.241,185.0,1.820,7632.943,175.0,3.229,6279.553,173.0,1.537,4705.732,158.0,4.097,11499.656,158.0,5.539,3154.687,150.0,3.633,11513.883,148.0,3.222,7234.794,147.0,3.653,1194.447,144.0,0.817,14143.495,135.0,6.151,5746.271,134.0,4.644,6836.645,128.0,2.693,1349.867,123.0,5.650,5760.498,118.0,2.577,13367.973,113.0,3.357,17789.846,110.0,4.497,4292.331,108.0,5.828,12036.461,102.0,5.621,6256.778,99.0,1.14,1059.38,98.0,0.66,5856.48,93.0,2.32,10213.29,92.0,0.77,16730.46,88.0,1.50,11926.25,86.0,1.42,5753.38,85.0,0.66,155.42,81.0,1.64,6681.22,80.0,4.11,951.72,66.0,4.55,5216.58,65.0,0.98,25132.30,64.0,4.19,6040.35,64.0,0.52,6290.19,63.0,1.51,5643.18,59.0,6.18,4164.31,57.0,2.30,10973.56,55.0,2.32,11506.77,55.0,2.20,1592.60,55.0,5.27,3340.61,54.0,5.54,553.57,53.0,5.04,9917.70,53.0,0.92,11371.70,52.0,3.98,17298.18,52.0,3.60,10969.97,49.0,5.91,3894.18,49.0,2.51,6127.66,48.0,1.67,12168.00,46.0,0.31,801.82,42.0,3.70,10575.41,42.0,4.05,10984.19,40.0,2.17,7860.42,40.0,4.17,26.30,38.0,5.82,7058.60,37.0,3.39,6496.37,36.0,1.08,6309.37,36.0,5.34,7079.37,34.0,3.62,11790.63,32.0,0.32,16200.77,31.0,4.24,3738.76,29.0,4.55,11856.22,29.0,1.26,8635.94,27.0,3.45,5884.93,26.0,5.08,10177.26,26.0,5.38,21228.39,24.0,2.26,11712.96,24.0,1.05,242.73,24.0,5.59,6069.78,23.0,3.63,6284.06,23.0,1.64,4732.03,22.0,3.46,213.30,21.0,1.05,3496.03,21.0,3.92,13916.02,21.0,4.01,5230.81,20.0,5.16,12352.85,20.0,0.69,1990.75,19.0,2.73,6062.66,19.0,5.01,11015.11,18.0,6.04,6283.01,18.0,2.85,7238.68,18.0,5.60,6283.14,18.0,5.16,17253.04,18.0,2.54,14314.17,17.0,1.58,7.11,17.0,0.98,3930.21,17.0,4.75,17267.27,16.0,2.19,6076.89,16.0,2.19,18073.70,16.0,6.12,3.52,16.0,4.61,9623.69,16.0,3.40,16496.36,15.0,0.19,9779.11,15.0,5.30,13517.87,15.0,4.26,3128.39,15.0,0.81,709.93,14.0,0.50,25158.60,14.0,4.38,4136.91,13.0,0.98,65147.62,13.0,3.31,154717.61,13.0,2.11,1589.07,13.0,1.92,22483.85,12.0,6.03,9225.54,12.0,1.53,12559.04,12.0,5.82,6282.10,12.0,5.61,5642.20,12.0,2.38,167283.76,12.0,0.39,12132.44,12.0,3.98,4686.89,12.0,5.81,12569.67,12.0,0.56,5849.36,11.0,0.45,6172.87,11.0,5.80,16858.48,11.0,6.22,12146.67,11.0,2.27,5429.88, 71 | ## R2 72 | 435939.0,5.784551,6283.075850,12363.0,5.57935,12566.15170,1234.0,3.1416,0.0000,879.0,3.628,77713.771,569.0,1.870,5573.143,330.0,5.470,18849.228,147.0,4.480,5507.553,110.0,2.842,161000.686,101.0,2.815,5223.694,85.0,3.11,1577.34,65.0,5.47,775.52,61.0,1.38,6438.50,50.0,4.42,6286.60,47.0,3.66,7084.90,46.0,5.39,149854.40,42.0,0.90,10977.08,40.0,3.20,5088.63,35.0,1.81,5486.78,32.0,5.35,3154.69,30.0,3.52,796.30,29.0,4.62,4690.48,28.0,1.84,4694.00,27.0,3.14,71430.70,27.0,6.17,6836.65,26.0,1.42,2146.17,25.0,2.81,1748.02,24.0,2.18,155.42,23.0,4.76,7234.79,21.0,3.38,7632.94,21.0,0.22,4705.73,20.0,4.22,1349.87,20.0,2.01,1194.45,20.0,4.58,529.69,19.0,1.59,6309.37,18.0,5.70,6040.35,18.0,6.03,4292.33,17.0,2.90,9437.76,17.0,2.00,8031.09,17.0,5.78,83996.85,16.0,0.05,2544.31,15.0,0.95,6127.66,14.0,0.36,10447.39,14.0,1.48,2352.87,13.0,0.77,553.57,13.0,5.48,951.72,13.0,5.27,6279.55,13.0,3.76,6812.77,11.0,5.41,6256.78,10.0,0.68,1592.60,10.0,4.95,398.15,10.0,1.15,3894.18,10.0,5.20,244287.60,10.0,1.94,11856.22,9.0,5.39,25132.30,8.0,6.18,1059.38,8.0,0.69,8429.24,8.0,5.85,242.73,7.0,5.26,14143.50,7.0,0.52,801.82,6.0,2.24,8635.94,6.0,4.00,13367.97,6.0,2.77,90955.55,6.0,5.17,7058.60,5.0,1.46,233141.31,5.0,4.13,7860.42,5.0,3.91,26.30,5.0,3.89,12036.46,5.0,5.58,6290.19,5.0,5.54,1990.75,5.0,0.83,11506.77,5.0,6.22,6681.22,4.0,5.26,10575.41,4.0,1.91,7477.52,4.0,0.43,10213.29,4.0,1.09,709.93,4.0,5.09,11015.11,4.0,4.22,88860.06,4.0,3.57,7079.37,4.0,1.98,6284.06,4.0,3.93,10973.56,4.0,6.18,9917.70,4.0,0.36,10177.26,4.0,2.75,3738.76,4.0,3.33,5643.18,4.0,5.36,25158.60, 73 | ## R3 74 | 14459.0,4.27319,6283.07585,673.0,3.917,12566.152,77.0,0.00,0.00,25.0,3.73,18849.23,4.0,2.80,6286.60, 75 | ## R4 76 | 386.0,2.564,6283.076,31.0,2.27,12566.15,5.0,3.44,5573.14,2.0,2.05,18849.23,1.0,2.06,77713.77,1.0,4.41,161000.69,1.0,3.82,149854.40,1.0,4.08,6127.66,1.0,5.26,6438.50, 77 | ## R5 78 | 9.0,1.22,6283.08,1.0,0.66,12566.15 79 | ], 80 | ] 81 | 82 | ## 月亮星历数据表 83 | #-- 84 | ## 以下是月球黄经周期项及泊松项,精度0.5角秒,平均误差0.8角秒,近期精度更高一些 85 | ## 1.黄经精度(角秒):0.5 86 | ## 2.黄纬精度(角秒):0.5 87 | ## 3.距离精度(千米):1 88 | ## 4.J2000.0时间最大偏移(世纪数):30 89 | ## 5.小数点增补位数:3 90 | ## 91 | ## 误差检测 92 | ## 1.测试点数N;2= y0 then 155 | jsd = 31 ## sjd是y1年之后的加速度估计。瑞士星历表jsd=31,NASA网站jsd=32,skmap的jsd=29 156 | return dt_ext(y, jsd) if y > y0+100 157 | v = dt_ext(y, jsd) ## 二次曲线外推 158 | dv= dt_ext(y0, jsd)-t0 ## ye年的二次外推与te的差 159 | return v-dv*(y0+100-y)/100.0 160 | end 161 | 162 | i = 0 163 | while i n2 194 | end 195 | 196 | j = n1; c= 0 197 | while j < _n do 198 | c += _f[j]*Math.cos(_f[j+1]+t*_f[j+2]) 199 | j += 3 200 | end 201 | v += c*tn 202 | 203 | i += 1 204 | tn *= t 205 | end 206 | 207 | v /= _f[0] 208 | if xt == 0 then ## 地球 209 | t2 = t*t; t3 = t2*t ## 千年数的各次方 210 | v += (-0.0728-2.7702*t-1.1019*t2-0.0996*t3) / RAD if zn == 0 211 | v += (+0.0000+0.0004*t+0.0004*t2-0.0026*t3) / RAD if zn == 1 212 | v += (-0.0020+0.0044*t+0.0213*t2-0.0250*t3) / 1000000.0 if zn == 2 213 | else ## 其它行星 214 | # 程序中用不到,执行到此处必然是出错了 215 | raise "r u come from earth?" 216 | =begin 217 | dv = XL0_XZB[(xt-1)*3+zn] 218 | if zn == 0 then 219 | v += -3*t/RAD 220 | elsif zn == 2 then 221 | v += dv/1000000.0 222 | else 223 | v += dv/RAD 224 | end 225 | =end 226 | end 227 | return v 228 | end 229 | 230 | ## 计算月亮 [星历] 231 | def xl1_calc(zn, t, n) 232 | ob = XL1[zn] 233 | v = 0; tn = 1 234 | t2 = t*t; t3 = t2*t; t4 = t3*t; t5 = t4*t; tx = t-10 235 | if zn == 0 then 236 | ## 月球平黄经(弧度) 237 | v += (3.81034409+8399.684730072*t-3.319e-05*t2+3.11e-08*t3-2.033e-10*t4)*RAD 238 | ## 岁差(角秒) 239 | v += 5028.792262*t+1.1124406*t2+0.00007699*t3-0.000023479*t4-0.0000000178*t5 240 | ## 对公元3000年至公元5000年的拟合,最大误差小于10角秒 241 | v += -0.866+1.43*tx+0.054*tx*tx if tx>0 242 | end 243 | t2 /= 1e4; t3 /= 1e8; t4 /= 1e8 244 | n *= 6; n = ob[0].length if n<0 245 | 246 | i = 0 247 | while i =_f.length 252 | 253 | j = 0; c = 0 254 | while j<_n do 255 | c += _f[j]*Math.cos(_f[j+1]+t*_f[j+2]+t2*_f[j+3]+t3*_f[j+4]+t4*_f[j+5]) 256 | j += 6 257 | end 258 | 259 | v += c*tn 260 | 261 | i += 1 262 | tn *= t 263 | end 264 | 265 | v /= RAD if zn != 2 266 | return v 267 | end 268 | 269 | ## 地球经度计算,返回Date分点黄经,传入世纪数、取项数 270 | def e_lon(t, n) 271 | return xl0_calc(0, 0, t, n) 272 | end 273 | 274 | ## 月球经度计算,返回Date分点黄经,传入世纪数,n是项数比例 275 | def m_lon(t, n) 276 | return xl1_calc(0, t, n) 277 | end 278 | 279 | ## 地球速度,t是世纪数,误差小于万分3 280 | def e_v(t) 281 | f = 628.307585*t 282 | return 628.332+21*Math.sin(1.527+f)+0.44*Math.sin(1.48+f*2)+0.129*Math.sin(5.82+f)*t+0.00055*Math.sin(4.21+f)*t*t 283 | end 284 | 285 | ## 月球速度计算,传入世经数 286 | def m_v(t) 287 | v = 8399.71-914*Math.sin(0.7848+8328.691425*t+0.0001523*t*t ) ## 误差小于5% 288 | v -= (179*Math.sin( 2.543 +15542.7543*t ) + ## 误差小于0.3% 289 | 160*Math.sin( 0.1874 + 7214.0629*t ) + 290 | 62 *Math.sin( 3.14 +16657.3828*t ) + 291 | 34 *Math.sin( 4.827 +16866.9323*t ) + 292 | 22 *Math.sin( 4.9 +23871.4457*t ) + 293 | 12 *Math.sin( 2.59 +14914.4523*t ) + 294 | 7 *Math.sin( 0.23 + 6585.7609*t ) + 295 | 5 *Math.sin( 0.9 + 25195.624*t ) + 296 | 5 *Math.sin( 2.32 - 7700.3895*t ) + 297 | 5 *Math.sin( 3.88 + 8956.9934*t ) + 298 | 5 *Math.sin( 0.49 + 7771.3771*t ) ) 299 | return v 300 | end 301 | 302 | ## 计算黄经章动 303 | def nutation_lon2(t) 304 | t2 = t*t; d_l = 0; _b = NUTB 305 | i = 0 306 | while i < _b.length do 307 | a = i == 0 ? -1.742*t : 0 308 | d_l += (_b[i+3]+a)*Math.sin(_b[i]+_b[i+1]*t+_b[i+2]*t2) 309 | i += 5 310 | end 311 | return d_l/100.0/RAD 312 | end 313 | 314 | ## 太阳光行差,t是世纪数 315 | def gxc_sun_lon(t) 316 | v = -0.043126+628.301955*t-0.000002732*t*t ## 平近点角 317 | e = 0.016708634-0.000042037*t-0.0000001267*t*t 318 | return (-20.49552*(1+e*Math.cos(v)))/RAD ## 黄经光行差 319 | end 320 | 321 | ## 太阳视黄经 322 | def s_alon(t, n) 323 | ## 注意,这里的章动计算很耗时 324 | return e_lon(t, n) + nutation_lon2(t) + gxc_sun_lon(t) + Math::PI 325 | end 326 | 327 | ## 已知太阳视黄经反求时间 328 | def s_alon_t(_w) 329 | v = 628.3319653318 330 | t = (_w-1.75347-Math::PI)/v 331 | v = e_v(t) ## v的精度0.03%,详见原文 332 | t += (_w-s_alon(t, 10))/v 333 | v = e_v(t) ## 再算一次v有助于提高精度,不算也可以 334 | t += (_w-s_alon(t, -1))/v 335 | return t 336 | end 337 | 338 | ## 已知太阳视黄经反求时间,高速低精度,最大误差不超过600秒 339 | def s_alon_t2(_w) 340 | v = 628.3319653318 341 | t = (_w-1.75347-Math::PI)/v; 342 | t -= (0.000005297*t*t+0.0334166*Math.cos(4.669257+628.307585*t)+0.0002061*Math.cos(2.67823+628.307585*t)*t)/v 343 | t += (_w-e_lon(t,8)-Math::PI+(20.5+17.2*Math.sin(2.1824-33.75705*t))/RAD)/v 344 | return t 345 | end 346 | 347 | ## 月球经度光行差,误差0.07" 348 | def gxc_moon_lon(t) 349 | return -3.4E-6 350 | end 351 | 352 | ## 月日视黄经的差值 353 | def ms_alon(t, _mn, _sn) 354 | return m_lon(t, _mn) + gxc_moon_lon(t) - (e_lon(t, _sn) + gxc_sun_lon(t) + Math::PI) 355 | end 356 | 357 | ## 已知月日视黄经差求时间 358 | def ms_alon_t(_w) 359 | v = 7771.37714500204 360 | t = (_w + 1.08472)/v; 361 | t += (_w - ms_alon(t,3,3))/v 362 | v = m_v(t) - e_v(t) # v的精度0.5%,详见原文 363 | t += (_w - ms_alon(t,20,10))/v 364 | t += (_w - ms_alon(t,-1,60))/v 365 | return t 366 | end 367 | 368 | ## 已知月日视黄经差求时间,高速低精度,误差不超过600秒(只验算了几千年) 369 | def ms_alon_t2(_w) 370 | v = 7771.37714500204 371 | t = (_w + 1.08472 )/v 372 | t2 = t*t 373 | t -= (-0.00003309*t2+0.10976*Math.cos(0.784758+8328.6914246*t+0.000152292*t2)+0.02224*Math.cos(0.18740+7214.0628654*t-0.00021848*t2)-0.03342*Math.cos(4.669257+628.307585*t))/v 374 | _l = m_lon(t,20)-(4.8950632+628.3319653318*t+0.000005297*t*t+0.0334166*Math.cos(4.669257+628.307585*t)+0.0002061*Math.cos(2.67823+628.307585*t)*t+0.000349*Math.cos(4.6261+1256.61517*t)-20.5/RAD) 375 | v = 7771.38-914*Math.sin(0.7848+8328.691425*t+0.0001523*t*t)-179*Math.sin(2.543+15542.7543*t)-160*Math.sin(0.1874+7214.0629*t) 376 | t += (_w-_l)/v 377 | return t 378 | end 379 | 380 | # 以下内容只跟求八字有关系 381 | 382 | ## 对超过0-2PI的角度转为0-2PI 383 | def rad2mrad(v) 384 | v = v.remainder(2*Math::PI) 385 | return v<0 ? v+2*Math::PI : v 386 | end 387 | 388 | ## 对超过-PI到PI的角度转为-PI到PI 389 | def rad2rrad(v) 390 | v = v.remainder(2*Math::PI) 391 | return v+2*Math::PI if v<=-Math::PI 392 | return v-2*Math::PI if v>Math::PI 393 | return v 394 | end 395 | 396 | ## 球面坐标旋转 397 | def llr_conv(_j_w, _e) 398 | ## 黄道赤道坐标变换,赤到黄E取负 399 | r = [0, 0, 0] 400 | _j = _j_w[0]; _w = _j_w[1] 401 | r[0] = Math.atan2(Math.sin(_j)*Math.cos(_e)-Math.tan(_w)*Math.sin(_e), Math.cos(_j)) 402 | r[1] = Math.asin(Math.cos(_e)*Math.sin(_w)+Math.sin(_e)*Math.cos(_w)*Math.sin(_j)) 403 | r[2] = _j_w[2] 404 | r[0] = rad2mrad(r[0]) 405 | return r 406 | end 407 | 408 | ## 时差计算(低精度),误差约在1秒以内,t力学时儒略世纪数 409 | def pty_zty2(t) 410 | _l = (1753470142+628331965331.8*t+5296.74*t*t)/1000000000.0 + Math::PI 411 | z = [] 412 | _e = (84381.4088-46.836051*t)/RAD 413 | z[0] = xl0_calc(0, 0, t, 5)+Math::PI; z[1] = 0 ## 地球坐标 414 | z = llr_conv(z, _e) ## z太阳地心赤道坐标 415 | _l = rad2rrad(_l-z[0]) 416 | return _l/(Math::PI*2) ## 单位是周(天) 417 | end 418 | # eph0.js end 419 | # lunar.js begin 420 | 421 | ## 气朔解压缩 422 | def jieya(s) 423 | o='0000000000'; o2=o+o 424 | s.gsub!(/J/,'00') 425 | s.gsub!(/I/,'000') 426 | s.gsub!(/H/,'0000') 427 | s.gsub!(/G/,'00000') 428 | s.gsub!(/t/,'02') 429 | s.gsub!(/s/,'002') 430 | s.gsub!(/r/,'0002') 431 | s.gsub!(/q/,'00002') 432 | s.gsub!(/p/,'000002') 433 | s.gsub!(/o/,'0000002') 434 | s.gsub!(/n/,'00000002') 435 | s.gsub!(/m/,'000000002') 436 | s.gsub!(/l/,'0000000002') 437 | s.gsub!(/k/,'01') 438 | s.gsub!(/j/,'0101') 439 | s.gsub!(/i/,'001') 440 | s.gsub!(/h/,'001001') 441 | s.gsub!(/g/,'0001') 442 | s.gsub!(/f/,'00001') 443 | s.gsub!(/e/,'000001') 444 | s.gsub!(/d/,'0000001') 445 | s.gsub!(/c/,'00000001') 446 | s.gsub!(/b/,'000000001') 447 | s.gsub!(/a/,'0000000001') 448 | s.gsub!(/A/,o2+o2+o2) 449 | s.gsub!(/B/,o2+o2+o) 450 | s.gsub!(/C/,o2+o2) 451 | s.gsub!(/D/,o2+o) 452 | s.gsub!(/E/,o2) 453 | s.gsub!(/F/,o) 454 | return s 455 | end 456 | 457 | ## 朔修正表 458 | SB = jieya('EqoFscDcrFpmEsF2DfFideFelFpFfFfFiaipqti1ksttikptikqckstekqttgkqttgkqteksttikptikq2fjstgjqttjkqttgkqtekstfkptikq2tijstgjiFkirFsAeACoFsiDaDiADc1AFbBfgdfikijFifegF1FhaikgFag1E2btaieeibggiffdeigFfqDfaiBkF1kEaikhkigeidhhdiegcFfakF1ggkidbiaedksaFffckekidhhdhdikcikiakicjF1deedFhFccgicdekgiFbiaikcfi1kbFibefgEgFdcFkFeFkdcfkF1kfkcickEiFkDacFiEfbiaejcFfffkhkdgkaiei1ehigikhdFikfckF1dhhdikcfgjikhfjicjicgiehdikcikggcifgiejF1jkieFhegikggcikFegiegkfjebhigikggcikdgkaFkijcfkcikfkcifikiggkaeeigefkcdfcfkhkdgkegieidhijcFfakhfgeidieidiegikhfkfckfcjbdehdikggikgkfkicjicjF1dbidikFiggcifgiejkiegkigcdiegfggcikdbgfgefjF1kfegikggcikdgFkeeijcfkcikfkekcikdgkabhkFikaffcfkhkdgkegbiaekfkiakicjhfgqdq2fkiakgkfkhfkfcjiekgFebicggbedF1jikejbbbiakgbgkacgiejkijjgigfiakggfggcibFifjefjF1kfekdgjcibFeFkijcfkfhkfkeaieigekgbhkfikidfcjeaibgekgdkiffiffkiakF1jhbakgdki1dj1ikfkicjicjieeFkgdkicggkighdF1jfgkgfgbdkicggfggkidFkiekgijkeigfiskiggfaidheigF1jekijcikickiggkidhhdbgcfkFikikhkigeidieFikggikhkffaffijhidhhakgdkhkijF1kiakF1kfheakgdkifiggkigicjiejkieedikgdfcggkigieeiejfgkgkigbgikicggkiaideeijkefjeijikhkiggkiaidheigcikaikffikijgkiahi1hhdikgjfifaakekighie1hiaikggikhkffakicjhiahaikggikhkijF1kfejfeFhidikggiffiggkigicjiekgieeigikggiffiggkidheigkgfjkeigiegikifiggkidhedeijcfkFikikhkiggkidhh1ehigcikaffkhkiggkidhh1hhigikekfiFkFikcidhh1hitcikggikhkfkicjicghiediaikggikhkijbjfejfeFhaikggifikiggkigiejkikgkgieeigikggiffiggkigieeigekijcijikggifikiggkideedeijkefkfckikhkiggkidhh1ehijcikaffkhkiggkidhh1hhigikhkikFikfckcidhh1hiaikgjikhfjicjicgiehdikcikggifikigiejfejkieFhegikggifikiggfghigkfjeijkhigikggifikiggkigieeijcijcikfksikifikiggkidehdeijcfdckikhkiggkhghh1ehijikifffffkhsFngErD1pAfBoDd1BlEtFqA2AqoEpDqElAEsEeB2BmADlDkqBtC1FnEpDqnEmFsFsAFnllBbFmDsDiCtDmAB2BmtCgpEplCpAEiBiEoFqFtEqsDcCnFtADnFlEgdkEgmEtEsCtDmADqFtAFrAtEcCqAE1BoFqC1F1DrFtBmFtAC2ACnFaoCgADcADcCcFfoFtDlAFgmFqBq2bpEoAEmkqnEeCtAE1bAEqgDfFfCrgEcBrACfAAABqAAB1AAClEnFeCtCgAADqDoBmtAAACbFiAAADsEtBqAB2FsDqpFqEmFsCeDtFlCeDtoEpClEqAAFrAFoCgFmFsFqEnAEcCqFeCtFtEnAEeFtAAEkFnErAABbFkADnAAeCtFeAfBoAEpFtAABtFqAApDcCGJ') 459 | ## 气修正表 460 | QB = jieya('FrcFs22AFsckF2tsDtFqEtF1posFdFgiFseFtmelpsEfhkF2anmelpFlF1ikrotcnEqEq2FfqmcDsrFor22FgFrcgDscFs22FgEeFtE2sfFs22sCoEsaF2tsD1FpeE2eFsssEciFsFnmelpFcFhkF2tcnEqEpFgkrotcnEqrEtFermcDsrE222FgBmcmr22DaEfnaF222sD1FpeForeF2tssEfiFpEoeFssD1iFstEqFppDgFstcnEqEpFg11FscnEqrAoAF2ClAEsDmDtCtBaDlAFbAEpAAAAAD2FgBiBqoBbnBaBoAAAAAAAEgDqAdBqAFrBaBoACdAAf1AACgAAAeBbCamDgEifAE2AABa1C1BgFdiAAACoCeE1ADiEifDaAEqAAFe1AcFbcAAAAAF1iFaAAACpACmFmAAAAAAAACrDaAAADG0') 461 | 462 | ## 朔直线拟合参数 463 | SUO_KB = [ 464 | 1457698.231017, 29.53067166, ## -721-12-17 h=0.00032 古历·春秋 465 | 1546082.512234, 29.53085106, ## -479-12-11 h=0.00053 古历·战国 466 | 1640640.735300, 29.53060000, ## -221-10-31 h=0.01010 古历·秦汉 467 | 1642472.151543, 29.53085439, ## -216-11-04 h=0.00040 古历·秦汉 468 | 469 | 1683430.509300, 29.53086148, ## -104-12-25 h=0.00313 汉书·律历志(太初历)平气平朔 470 | 1752148.041079, 29.53085097, ## 85-02-13 h=0.00049 后汉书·律历志(四分历) 471 | 1807665.420323, 29.53059851, ## 237-02-12 h=0.00033 晋书·律历志(景初历) 472 | 1883618.114100, 29.53060000, ## 445-01-24 h=0.00030 宋书·律历志(何承天元嘉历) 473 | 1907360.704700, 29.53060000, ## 510-01-26 h=0.00030 宋书·律历志(祖冲之大明历) 474 | 1936596.224900, 29.53060000, ## 590-02-10 h=0.01010 随书·律历志(开皇历) 475 | 1939135.675300, 29.53060000, ## 597-01-24 h=0.00890 随书·律历志(大业历) 476 | 1947168.00 ## 619-01-21 477 | ] 478 | 479 | ## 气直线拟合参数 480 | QI_KB = [ 481 | 1640650.479938, 15.21842500, ## -221-11-09 h=0.01709 古历·秦汉 482 | 1642476.703182, 15.21874996, ## -216-11-09 h=0.01557 古历·秦汉 483 | 484 | 1683430.515601, 15.218750011, ## -104-12-25 h=0.01560 汉书·律历志(太初历)平气平朔 回归年=365.25000 485 | 1752157.640664, 15.218749978, ## 85-02-23 h=0.01559 后汉书·律历志(四分历) 回归年=365.25000 486 | 1807675.003759, 15.218620279, ## 237-02-22 h=0.00010 晋书·律历志(景初历) 回归年=365.24689 487 | 1883627.765182, 15.218612292, ## 445-02-03 h=0.00026 宋书·律历志(何承天元嘉历) 回归年=365.24670 488 | 1907369.128100, 15.218449176, ## 510-02-03 h=0.00027 宋书·律历志(祖冲之大明历) 回归年=365.24278 489 | 1936603.140413, 15.218425000, ## 590-02-17 h=0.00149 随书·律历志(开皇历) 回归年=365.24220 490 | 1939145.524180, 15.218466998, ## 597-02-03 h=0.00121 随书·律历志(大业历) 回归年=365.24321 491 | 1947180.798300, 15.218524844, ## 619-02-03 h=0.00052 新唐书·历志(戊寅元历)平气定朔 回归年=365.24460 492 | 1964362.041824, 15.218533526, ## 666-02-17 h=0.00059 新唐书·历志(麟德历) 回归年=365.24480 493 | 1987372.340971, 15.218513908, ## 729-02-16 h=0.00096 新唐书·历志(大衍历,至德历) 回归年=365.24433 494 | 1999653.819126, 15.218530782, ## 762-10-03 h=0.00093 新唐书·历志(五纪历) 回归年=365.24474 495 | 2007445.469786, 15.218535181, ## 784-02-01 h=0.00059 新唐书·历志(正元历,观象历) 回归年=365.24484 496 | 2021324.917146, 15.218526248, ## 822-02-01 h=0.00022 新唐书·历志(宣明历) 回归年=365.24463 497 | 2047257.232342, 15.218519654, ## 893-01-31 h=0.00015 新唐书·历志(崇玄历) 回归年=365.24447 498 | 2070282.898213, 15.218425000, ## 956-02-16 h=0.00149 旧五代·历志(钦天历) 回归年=365.24220 499 | 2073204.872850, 15.218515221, ## 964-02-16 h=0.00166 宋史·律历志(应天历) 回归年=365.24437 500 | 2080144.500926, 15.218530782, ## 983-02-16 h=0.00093 宋史·律历志(乾元历) 回归年=365.24474 501 | 2086703.688963, 15.218523776, ## 1001-01-31 h=0.00067 宋史·律历志(仪天历,崇天历) 回归年=365.24457 502 | 2110033.182763, 15.218425000, ## 1064-12-15 h=0.00669 宋史·律历志(明天历) 回归年=365.24220 503 | 2111190.300888, 15.218425000, ## 1068-02-15 h=0.00149 宋史·律历志(崇天历) 回归年=365.24220 504 | 2113731.271005, 15.218515671, ## 1075-01-30 h=0.00038 李锐补修(奉元历) 回归年=365.24438 505 | 2120670.840263, 15.218425000, ## 1094-01-30 h=0.00149 宋史·律历志 回归年=365.24220 506 | 2123973.309063, 15.218425000, ## 1103-02-14 h=0.00669 李锐补修(占天历) 回归年=365.24220 507 | 2125068.997336, 15.218477932, ## 1106-02-14 h=0.00056 宋史·律历志(纪元历) 回归年=365.24347 508 | 2136026.312633, 15.218472436, ## 1136-02-14 h=0.00088 宋史·律历志(统元历,乾道历,淳熙历) 回归年=365.24334 509 | 2156099.495538, 15.218425000, ## 1191-01-29 h=0.00149 宋史·律历志(会元历) 回归年=365.24220 510 | 2159021.324663, 15.218425000, ## 1199-01-29 h=0.00149 宋史·律历志(统天历) 回归年=365.24220 511 | 2162308.575254, 15.218461742, ## 1208-01-30 h=0.00146 宋史·律历志(开禧历) 回归年=365.24308 512 | 2178485.706538, 15.218425000, ## 1252-05-15 h=0.04606 淳祐历 回归年=365.24220 513 | 2178759.662849, 15.218445786, ## 1253-02-13 h=0.00231 会天历 回归年=365.24270 514 | 2185334.020800, 15.218425000, ## 1271-02-13 h=0.00520 宋史·律历志(成天历) 回归年=365.24220 515 | 2187525.481425, 15.218425000, ## 1277-02-12 h=0.00520 本天历 回归年=365.24220 516 | 2188621.191481, 15.218437494, ## 1280-02-13 h=0.00015 元史·历志(郭守敬授时历) 回归年=365.24250 517 | 2322147.76 ## 1645-09-21 518 | ] 519 | 520 | ## 低精度定朔计算,在2000年至600,误差在2小时以内(仍比古代日历精准很多) 521 | def so_low(_w) 522 | v = 7771.37714500204 523 | t = (_w+1.08472)/v 524 | t -= (( -0.0000331*t*t + 525 | 0.10976*Math.cos(0.785 + 8328.6914*t) + 526 | 0.02224*Math.cos(0.187 + 7214.0629*t) - 527 | 0.03342*Math.cos(4.669 + 628.3076*t) )/v + 528 | (32*(t+1.8)*(t+1.8)-20)/86400.0/36525.0) 529 | return t*36525+8.0/24.0 530 | end 531 | 532 | ## 最大误差小于30分钟,平均5分 [低精度定气计算] 533 | def qi_low(_w) 534 | v = 628.3319653318 535 | t = (_w-4.895062166)/v ## 第一次估算,误差2天以内 536 | ## 第二次估算,误差2小时以内 537 | t -= (53*t*t+334116*Math.cos(4.67+628.307585*t)+2061*Math.cos(2.678+628.3076*t)*t )/v/10000000.0 538 | 539 | _l = (48950621.66 + 6283319653.318*t + 53*t*t + ## 平黄经 540 | 334166 * Math.cos(4.669257+628.307585*t) + ## 地球椭圆轨道级数展开 541 | 3489 * Math.cos(4.6261+1256.61517*t) + ## 地球椭圆轨道级数展开 542 | 2060.6 * Math.cos(2.67823+628.307585*t) * t - ## 一次泊松项 543 | 994 - 834*Math.sin(2.1824-33.75705*t)) ## 光行差与章动修正 544 | 545 | t -= (_l/10000000.0-_w)/628.332+(32*(t+1.8)*(t+1.8)-20)/86400.0/36525.0 546 | return t*36525+8.0/24.0 547 | end 548 | 549 | ## 较高精度气 550 | def qi_high(_w) 551 | t = s_alon_t2(_w)*36525 552 | t = t-dt_t(t)+8.0/24.0 553 | v = ((t+0.5).remainder(1))*86400 554 | t = s_alon_t(_w)*36525-dt_t(t)+8.0/24.0 if v<1200 || v >86400-1200 555 | return t 556 | end 557 | 558 | ## 较高精度朔 559 | def so_high(_w) 560 | t = ms_alon_t2(_w)*36525 561 | t = t-dt_t(t)+8.0/24.0 562 | v = ((t+0.5).remainder(1))*86400 563 | t = ms_alon_t(_w)*36525-dt_t(t)+8.0/24.0 if v<1800 || v >86400-1800 564 | return t 565 | end 566 | 567 | ## jd应靠近所要取得的气朔日,qs='气'时,算节气的儒略日 568 | def calc(jd, qs) 569 | jd += 2451545 570 | if qs then 571 | _b = QI_KB; pc = 7 572 | else 573 | _b = SUO_KB; pc = 14 574 | end 575 | f1 = _b[0]-pc; f2 = _b[_b.length-1]-pc; f3 = 2436935.0 576 | 577 | ## 平气朔表中首个之前,使用现代天文算法。1960.1.1以后,使用现代天文算法 (这一部分调用了qi_high和so_high,所以需星历表支持) 578 | if jd=f3 then 579 | if qs then 580 | ## 2451259是1999.3.21,太阳视黄经为0,春分.定气计算 581 | return (qi_high(((jd+pc-2451259)/365.2422*24).floor*Math::PI/12)+0.5).floor 582 | else 583 | ## 2451551是2000.1.7的那个朔日,黄经差为0.定朔计算 584 | return (so_high(((jd+pc-2451551)/29.5306).floor*Math::PI*2)+0.5).floor 585 | end 586 | end 587 | 588 | ## 平气或平朔 589 | if jd>=f1 && jd=f2 && jd int # 闰月位置 628 | ## * :ym => [] # 各月名称 629 | ## * :zq => {} # 中气表,其中.liqiu是节气立秋的儒略日,计算三伏时用到 630 | ## * :hs => [] # 合朔表 631 | ## * :dx => [] # 各月大小 632 | #-- 633 | # 月名的部分,原始程序返回中文内容。考虑到处理简繁体的问题,改会返回数组下标。 634 | #++ 635 | def calc_y(jd) 636 | __leap = 0; __ym = []; __zq = {}; __hs = []; __dx = [] 637 | 638 | ## 该年的气 639 | _w = ((jd-355+183)/365.2422).floor*365.2422+355 ## 355是2000.12冬至,得到较靠近jd的冬至估计值 640 | _w -= 365.2422 if calc(_w, true)>jd 641 | i = 0 642 | while i<25 do 643 | ## 25个节气时刻(北京时间),从冬至开始到下一个冬至以后 644 | __zq[i] = calc(_w+15.2184*i, true) 645 | i += 1 646 | end 647 | 648 | ## 补算二气,确保一年中所有月份的“气”全部被计算在内 649 | __zq[:pe1] = calc(_w-15.2, true) 650 | __zq[:pe2] = calc(_w-30.4, true) 651 | 652 | ## 今年"首朔"的日月黄经差w 653 | w = calc(__zq[0], false) ## 求较靠近冬至的朔日 654 | w -= 29.53 if w>__zq[0] 655 | 656 | ## 该年所有朔,包含14个月的始末 657 | i = 0 658 | while i<15 do 659 | __hs[i] = calc(w+29.5306*i, false) 660 | i += 1 661 | end 662 | 663 | ## 月大小 664 | i = 0 665 | while i<14 do 666 | __dx[i] = __hs[i+1]-__hs[i] ## 月大小 667 | __ym[i] = i ## 月序初始化 668 | i += 1 669 | end 670 | 671 | ## -721年至-104年的后九月及月建问题,与朔有关,与气无关 672 | _yy = ((__zq[0]+10+180)/365.2422).floor + 2000 ## 确定年份 673 | if _yy>=-721 && _yy <=-104 then 674 | ns = [] 675 | i = 0 676 | while i<3 do 677 | yy = _yy+i-1 678 | ## 颁行历年首, 闰月名称, 月建 679 | if yy>=-721 then 680 | ## 春秋历,ly为-722.12.17 681 | ns[i] = calc(1457698-J2000+(0.342+(yy+721)*12.368422).floor*29.5306, false) 682 | #ns[i+3] = '十三' 683 | ns[i+3] = 12 684 | ns[i+6] = 2 685 | end 686 | if yy>=-479 then 687 | ## 战国历,ly为-480.12.11 688 | ns[i] = calc(1546083-J2000+(0.500+(yy+479)*12.368422).floor*29.5306, false) 689 | #ns[i+3] = '十三' 690 | ns[i+3] = 12 691 | ns[i+6] = 2 692 | end 693 | if yy>=-220 then 694 | ## 秦汉历,ly为-221.10.31 695 | ns[i] = calc(1640641-J2000+(0.866+(yy+220)*12.369000).floor*29.5306, false) 696 | #ns[i+3] = '后九' 697 | ns[i+3] = 13 698 | ns[i+6] = 11 699 | end 700 | i += 1 701 | end 702 | 703 | i = 0 704 | while i<14 do 705 | nn = 2 706 | while nn > 0 do 707 | break if __hs[i]>=ns[nn] 708 | nn -= 1 709 | end 710 | f1 = ((__hs[i]-ns[nn]+15)/29.5306).floor ## 该月积数 711 | #__ym[i] = f1<12 ? YMC[(f1+ns[nn+6])%12] : ns[nn+3] 712 | __ym[i] = f1<12 ? (f1+ns[nn+6])%12 : ns[nn+3] 713 | i += 1 714 | end 715 | 716 | return {:leap=>__leap, :ym=>__ym, :zq=>__zq, :hs=>__hs, :dx=>__dx} 717 | end 718 | 719 | ## 无中气置闰法确定闰月,(气朔结合法,数据源需有冬至开始的的气和朔) 720 | if __hs[13] <= __zq[24] then 721 | ## 第13月的月末没有超过冬至(不含冬至),说明今年含有13个月 722 | i = 1 723 | i += 1 while __hs[i+1]>__zq[2*i] && i<13 ## 在13个月中找第1个没有中气的月份 724 | __leap = i 725 | while i<14 do 726 | __ym[i] -= 1 727 | i += 1 728 | end 729 | end 730 | 731 | ## 名称转换(月建别名) 732 | i = 0 733 | while i<14 do 734 | _dm = __hs[i]+J2000; v2 = __ym[i] ## _dm初一的儒略日,v2为月建序号 735 | #mc = YMC[v2%12] ## 月建对应的默认月名称:建子十一,建丑十二,建寅为正…… 736 | mc = v2%12 737 | # 参见:http://202.113.20.150/gj/showwords.asp?airid=251 738 | if _dm>=1724360 && _dm<=1729794 then 739 | # 王莽改用殷正,即以西汉孺子婴初始元年(公元8年) 740 | # 十二月为其始建国元年(公元9年)的正月,故初始元年没有十二月。 741 | # 到西汉淮阳王复夏正,即以王莽地皇四年(公元23年)的十一月为其更始元年的 742 | # 十月,故这一年有两个十月。 743 | #mc = YMC[(v2+1)%12] ## 8.01.15至 23.12.02 建子为十二,其它顺推 744 | mc = (v2+1)%12 745 | elsif _dm>=1807724 && _dm<=1808699 then 746 | # 魏明帝景初元年(公元237年)改用殷正,即以是年的三月为四月,故是年无三月。 747 | # 到景初三年(公元239年)十二月复夏正,放是年有两个十二月。 748 | #mc = YMC[(v2+1)%12] ## 237.04.12至239.12.13 建子为十二,其它顺推 749 | mc = (v2+1)%12 750 | elsif _dm>=1999349 && _dm<=1999467 then 751 | # 唐肃宗上元二年(公元761年)九月去年号,称元年,改用周正,以建子月为岁首, 752 | # 以十二辰为月名;至建已月又改元年为宝应元年(公元762年),复夏正,即仍以 753 | # 建寅月为岁首。代宗即位不改元,是年有两个十一月及十二月。 754 | #mc = YMC[(v2+2)%12] ## 761.12.02至762.03.30 建子为正月,其它顺推 755 | mc = (v2+2)%12 756 | elsif _dm>=1973067 && _dm<=1977052 then 757 | # 武则天改用周正,即以其永昌元年(公元689年)的十一月为其载初元年的正月, 758 | # 十二月为腊月,来年正月为一月,故永昌元年只有十个月。到其久视元年 759 | # (公元700年)十月复夏正,故是年有两个十一月及十二月。 760 | ## 689.12.18至700.11.15 建子为正月,建寅为一月,其它不变 761 | #mc = '正' if v2.remainder(12)==0 762 | mc = 2 if v2.remainder(12)==0 763 | #mc = '一' if v2==2 764 | mc = 14 if v2==2 765 | end 766 | 767 | # 这应该是搞历史的人去纠结的问题 768 | ## 239.12.13及23.12.02均为十二月,为避免两个连续十二月,此处改名 769 | #mc = '拾贰' if _dm==1729794||_dm==1808699 770 | 771 | __ym[i] = mc 772 | i += 1 773 | end 774 | 775 | return {:leap=>__leap, :ym=>__ym, :zq=>__zq, :hs=>__hs, :dx=>__dx} 776 | end 777 | 778 | # lunar.js end 779 | end 780 | end --------------------------------------------------------------------------------