def main(): parser = ArgumentParser(description = 'Calender') parser.add_argument('-y', '--year', required = False, help = 'Specify the year to calulate.') parser.add_argument('-t', '--time', required = False, help = 'Specify the time to calulate,like: "2014-08-1" or "# "2014-12-01 13:12:12"') parser.add_argument('-g', '--gender', required = False, default = 'M', help = 'Specify the gender of the person to calulate, like: "M" or "F"') args = parser.parse_args() yy = GZTime() if args.year: yy = GZTime(int(args.year)) else: if not args.time: args.time = "1979-11-13 15:20:00" print args.time tt = None try: tt = datetime.strptime(args.time,'%Y-%m-%d %X') except ValueError as e: tt = datetime.strptime(args.time,'%Y-%m-%d') yy.setTime(tt) if args.gender != 'M' and args.gender != 'F': print "Error in gender, it should be 'F' or 'M'." return gzNumber = HLNumbers( args.gender, # 'M' or 'F' yy ) gzNumber.dump()
class WuYun: ZhongYun = { "甲": "土运太过--岁土太过,雨湿流行", "己": "土运不及--岁土不及,风乃大行", "乙": "金运不及--岁金不及,炎火乃行", "庚": "金运太过--岁金太过,燥气流行", "丙": "水运太过--岁水太过,寒气流行", "辛": "水运不及--岁水不及,湿乃大行", "丁": "木运不及--岁木不及,燥乃大行", "壬": "木运太过--岁木太过,风气流行", "戊": "火运太过--岁火太过,炎暑流行", "癸": "火运不及--岁火不及,寒乃大行" } WuYun = "初运 二运 三运 四运 终运".split(' ') # 阳干 # YangGan = ["甲", "丙", "戊", "庚", "壬"] def __init__(self, yy): self.year = yy self.gz = GZTime(yy) self.y_tiangan = self.gz.getYTiangan() self.y_dizhi = self.gz.getYDizhi() self.zhongyun = WuYun.ZhongYun[self.y_tiangan] self.st = SolarTerm() # 中运的初运日为去年的大寒节日 self.cy_time = self.st.getJieqiTime(yy - 1, "大寒") self.cy_gzt = GZTime() self.cy_gzt.setTime(self.cy_time) # 判断干德符 self.gdf = self.y_tiangan == self.cy_gzt.getDTiangan() or self.y_tiangan == self.cy_gzt.getHTiangan() self.gdfStr = None if self.y_tiangan == self.cy_gzt.getDTiangan(): self.gdf = True self.gdfStr = "年干与交运第一天的日干相合" if self.y_tiangan == self.cy_gzt.getHTiangan(): self.gdf = True self.gdfStr = "年干与交运第一天的时干相合" # 计算交司时刻 # 每时辰八刻(初初刻、初一刻、初二刻、初三刻、初四刻、正初刻、正一刻、正二刻、正三刻、正四刻) keList = [0, 144, 1008, 1872, 2736, 3600, 3744, 4608, 5472, 6336] keOff = [0, 6, 2, 8, 4] hoff = [3, 9, 15, 21] JQMark = ["大寒", "春分", "芒种", "处暑", "立冬"] JQYear = [yy - 1, yy, yy, yy, yy, yy] daysOff = [0, 13, 10, 7, 4] hi = GZTime.Dizhi.index(self.y_dizhi) % 4 self.t = [] for i in xrange(0,6): d = self.st.getJieqiTime(JQYear[i], JQMark[i%5]) d2 = datetime(d.year, d.month, d.day, hoff[hi]) + timedelta(seconds=keList[keOff[i%5]]) + timedelta(days=daysOff[i%5]) self.t.append(d2) # print WuYun.WuYun[i%5], " | ", self.t[i] # 年的天干地支 def getYTD(self): return self.y_tiangan + self.y_dizhi def __str__(self): ss = "中运:" + self.zhongyun + "\n" \ "初运日: " + str(self.cy_gzt.time) + " : " + str(self.cy_gzt) + "\n" if self.gdf: ss += "干德符 --> 平气 : " + self.gdfStr return ss # 五运三纪 def getWuYunSanJi(self): ss = str(self.year) + " 五运三纪: " if self.gdf: ss += "平气" + " (干德符: " + self.gdfStr + ")" else: ss += self.zhongyun return ss def getZhongYun(self): i = GZTime.Tiangan.index(self.y_tiangan) wy = WuYin(i % 2, i % 5) return wy def getZhongYunZhiQi(self): zy = self.getZhongYun() return zy.getQi(), zy.getTaiShao() def getKeYun(self): i = GZTime.Tiangan.index(self.y_tiangan) wy = WuYin(i % 2, i % 5) res = [] for i in xrange(0,5): res.append(wy.next(i)) return res def getKeYunList(self): kyL = self.getKeYun() res = [] for i in kyL: res.append(str(i)) return res def getZhuYunList(self): zyL = self.getZhuYun() res = [] for i in zyL: res.append(str(i)) return res def getZhuYun(self): i = GZTime.Tiangan.index(self.y_tiangan) j = i % 5 wy = WuYin(i % 2, j) res = [wy] wy2 = wy while not wy2.isJiao(): wy2 = wy2.prev(1) res.insert(0,wy2) while not wy.isYu(): wy = wy.next(1) res.append(wy) return res # 五运交司时刻 def getWuYunTime(self): tt = [] for i in xrange(0,5): tt.append(str(self.t[i]) + " - " + str(self.t[i+1])) return tt def getWuYunTimeFormatStr(self): s = "| {0:68}|\n".format("五运交司时刻:") for i in xrange(0,5): s += "| " + WuYun.WuYun[i] + " : {0:^54} |".format(str(self.t[i]) + " - " + str(self.t[i+1])) if i != 4: s += "\n" return s # 相得不相得 def calcZhuKe(self, zz, kk): z = zz.index k = kk.index if z == k: return True, "同气求" if ((z+1) % 5) == k: return True, "主生客" if (z-1) % 5 == k: return True, "客生主" if (z+2) % 5 == k: return False, "主克客" if (z-2) % 5 == k: return True, "客克主" return None # 判断主运与客运是否相得 def getXiangDe(self, zy, ky): xd = [] for i in xrange(0,5): xd.append(self.calcZhuKe(zy[i],ky[i])) return xd def getXiangDeFormatStr(self, zy, ky): s = "| 相得 |" xd = [None, None, None, None, None] for i in xrange(0,5): xd[i] = self.calcZhuKe(zy[i], ky[i]) if xd[i][0]: s += " {0:12}".format(xd[i][1]) else: s += " {0:^8} ".format("X") s += "|" return s # 判断主运与客运是否不相得 def getBuXiangDeFormatStr(self, zy, ky): s = "| 不相得 |" xd = [None, None, None, None, None] for i in xrange(0,5): xd[i] = self.calcZhuKe(zy[i], ky[i]) if not xd[i][0]: s += " {0:12}".format(xd[i][1]) else: s += " {0:^8} ".format("X") s += "|" return s def toSimpleJson(self): zy = self.getZhuYun() ky = self.getKeYun() ret = {} ret["交司时刻"] = self.getWuYunTime() ret["客运"] = self.getKeYunList() ret["中运"] = str(self.getZhongYun()) ret["主运"] = self.getZhuYunList() ret["相得"] = self.getXiangDe(zy, ky) return ret def toString(self): zy = self.getZhuYun() ky = self.getKeYun() ret = "" sep = "+---------------------------------------------------------------+" ret += sep ret += "\n|{0:^65}|".format("五运") ret += "\n" + sep ret += "\n" + self.getWuYunTimeFormatStr() ret += "\n" + sep ret += "\n| | 初运 | 二运 | 三运 | 四运 | 终运 |" ret += "\n| 客运 | " + " | ".join(self.getKeYunList()) + " | " ret += "\n| 中运 | {0:^56}| ".format(str(self.getZhongYun())) ret += "\n| 主运 | " + " | ".join(list2str(zy)) + " | " ret += "\n" + sep ret += "\n" + self.getXiangDeFormatStr(zy, ky) ret += "\n" + self.getBuXiangDeFormatStr(zy, ky) ret += "\n" + sep return ret