1.后天八卦
后天八卦对应数字的盘为:
4 9 2
3 5 7
8 1 6
巽 离 坤
震 囗 兑
艮 坎 乾
也对应方位:1为正北, 9为正南
2.确定局
季节对应后天八卦为定局基础框架.
阳局: 冬至:1 立春:8 春分:3 立夏:4
阴局: 夏至:9 立秋:2 秋分:7 立冬:6
然后再加入其他16个节气, 阳局的节气依次比上一个节气+1, 阴局依次比上一个节气-1. 可得:
{"冬至":1,"小寒":2,"大寒":3,"立春":8,"雨水":9,"惊蛰":1,"春分":3,"清明":4,"谷雨":5,"立夏":4,"小满":5,"芒种":6}
{"夏至":9,"小暑":8,"大暑":7,"立秋":2,"处暑":1,"白露":9,"秋分":7,"寒露":6,"霜降":5,"立冬":6,"小雪":5,"大雪":4}
由于从甲子开始60天循环4次15天上中下元,因此根据天干日可算出本日的元, 5日起始一定为甲或己,根据本元首的地支可确定上中下.
tmp_dz = ybtext.dizhi.index(zday) - ybtext.tiangan.index(gday) % 5
tmp_dz = tmp_dz if tmp_dz >= 0 else tmp_dz+12
yuan = tmp_dz % 3
yuan = 0 if yuan == 0 else 3-yuan
元首地支与上中下的对应关系是
1子,4卯,7午,10酉 对 上元
2丑,5辰,8未,11戌 对 下元
3寅,6巳,9申,12亥 对 中元
记法:从子到亥, 记为上下中的4次循环即可
最终局的计算公式为:
上元对应局数都为当前节气对应数字.
中元和下元根据阴阳不同,
中元 在阳局中为 节气对应数字+6局, 阴局中为 节气对应数字-6局
下元 在阳局中为 节气对应数字+12局, 阴局中为 节气对应数字-12局
如冬至 上,中,下元 对应 阳遁 1,7,4 局
3.地盘演算
向后天八卦中插入甲以外的地支, 顺序为三奇以外的地支+三奇的倒序:
戊,己,庚,辛,壬,癸,丁,丙,乙
从局数的宫开始插入, 如阴6局就戊入住6宫, 根据阴阳决定下一个插入到+1宫还是-1宫, 阴局就是己入驻5宫
阴6局的地盘演算出来为:
庚 丁 壬
辛 己 乙
丙 癸 戊
4.值符值使
每天子时的天干可通过日的天干计算:
甲己对应甲, 乙庚对应丙, 丙辛对应戊, 丁壬对应庚, 戊癸对应壬
gday2firstgz = {"甲": 0, "乙": 2, "丙": 4, "丁": 6,
"戊": 8, "己": 0, "庚": 2, "辛": 4, "壬": 6, "癸": 8}
gday = gzday[0:1]
zday = gzday[1:2]
gan_zishi = gday2firstgz[gday]
dizhi_time = (math.floor((hour+1)/2)) % 12
tiangan_time = (gan_zishi + dizhi_time) % 10
gztime = ybtext.tiangan[tiangan_time] + ybtext.dizhi[dizhi_time]
计算当前时辰的旬首,即甲[地支], 如丙申时的旬首为甲午
id_xunshou = dizhi_time - tiangan_time if dizhi_time >= tiangan_time else dizhi_time + 12 - tiangan_time
根据旬首可算出对应遁甲:
dunjia = {0: 4, 10: 5, 8: 6, 6: 7, 4: 8, 2: 9}
id_dun = dunjia[id_xunshou]
gong_zhifu = dipan.index(ybtext.tiangan[id_dun])
其中dunjia为旬首地支对应的值符值使地支. 一共六旬分别对应六个地支(甲和三奇以外):
1旬:甲子遁于戊
2旬:甲戌遁于己
3旬:甲申遁于庚
4旬:甲午遁于辛
5旬:甲辰遁于壬
6旬:甲寅遁于癸
如丙申时的旬首为甲午, 遁于辛, 对应阴6局的地盘为3宫, 得到值符为天冲, 伤门.
5.天盘转动
值符转动到时干所在宫, 如阴6局,丙申时, 值符天冲入住丙所在地宫3宫. 其他天星依次排序
jiuxing = ["囗","蓬","芮","冲","辅","禽","心","柱","任","英"]
6.人盘转动
值使根据与旬首的差n, 阳+n宫, 阴-n宫, 如阴6局, 丙申时, 值使伤门入住3-2=1宫. 其他门依次排序
bamen = ["囗","休","死","伤","杜","死","开","惊","生","景"]
7.神盘转动
值符对应值符所在宫, 其他神依次排序
shen_yang = ["囗","值符","玄武","太阴","六合","勾陈","九天","九地","腾蛇","白虎"]
shen_yin = ["囗","值符","六合","九地","玄武","勾陈","腾蛇","太阴","九天","白虎"]
8.算法代码
def ganzhi(self, org) -> str:
httpClient = None
myurl = "http://api.tianapi.com/txapi/lunar/index"
key = "xxxxxxxxxx"
date_q = org.strip()
hour = 0
min = 0
sec = 0
if date_q == "":
date_q = time.strftime("%Y-%m-%d")
hour = (int)(time.strftime("%H"))
min = (int)(time.strftime("%M"))
sec = (int)(time.strftime("%S"))
elif re.match("\\d+-\\d+-\\d+ \\d+:\\d+:\\d+", date_q):
mt = re.match("(\\d+-\\d+-\\d+) (\\d+):(\\d+):(\\d+)", date_q)
date_q = mt.group(1)
hour = (int)(mt.group(2))
min = (int)(mt.group(3))
sec = (int)(mt.group(4))
elif re.match("[+-]\\d+(\\.\\d+)?", date_q):
mt = re.match("([+-])(\\d+(\\.\\d+)?)", date_q)
timestamp_add = (float)(mt.group(2)) * \
(mt.group(1) == '+' and 3600 or -3600)
# print(f'timestamp_add:{timestamp_add}')
target_time = time.localtime(time.time() + timestamp_add)
date_q = time.strftime("%Y-%m-%d", target_time)
hour = (int)(time.strftime("%H", target_time))
#print(f'date_q:{date_q}, hour:{hour}')
else:
return ybtext.msg_illegal[5]
if hour >= 23:
date_q = time.strftime("%Y-%m-%d", time.localtime(time.mktime(
time.strptime(date_q, "%Y-%m-%d")) + (hour - 23 + 24) * 3600))
hour = max(hour - 24, 0)
turl = myurl + '?key=' + key + '&date=' + date_q
asw = ybtext.msg_notfind[2]
ifqmds = False
ifbad = False
try:
print(turl)
f = urllib.request.urlopen(turl, timeout=8)
result_all = f.read()
result = json.loads(result_all)
if result['code'] != 200:
return ybtext.msg_illegal[5]
hllist = result['newslist'][0]
gzyear = hllist['tiangandizhiyear']
gzmonth = hllist['tiangandizhimonth']
gzday = hllist['tiangandizhiday']
gday2firstgz = {"甲": 0, "乙": 2, "丙": 4, "丁": 6,
"戊": 8, "己": 0, "庚": 2, "辛": 4, "壬": 6, "癸": 8}
gday = gzday[0:1]
zday = gzday[1:2]
gan_zishi = gday2firstgz[gday]
dizhi_time = (math.floor((hour+1)/2)) % 12
tiangan_time = (gan_zishi + dizhi_time) % 10
gztime = ybtext.tiangan[tiangan_time] + ybtext.dizhi[dizhi_time]
asw = ybtext.msg_ganzhi[0].format(gzyear, gzmonth, gzday, gztime)
# compute qimendunjia
ct = 0
idate = date_q
jieqi = ""
while ct < 60:
if hllist['jieqi'] != "":
jieqi = hllist['jieqi']
break
else:
idate = time.strftime(
"%Y-%m-%d", time.localtime(time.mktime(time.strptime(idate, "%Y-%m-%d")) - 24 * 3600))
iurl = myurl + '?key=' + key + '&date=' + idate
f = urllib.request.urlopen(iurl, timeout=8)
result_all = f.read()
result = json.loads(result_all)
if result['code'] != 200:
print('fail to get jieqi, wrong url:', iurl)
print('result:', result)
else:
#print(iurl, ct, result)
hllist = result['newslist'][0]
ct += 1
if ct % 10 == 0:
time.sleep(1)
tmp_dz = ybtext.dizhi.index(zday) - ybtext.tiangan.index(gday) % 5
tmp_dz = tmp_dz if tmp_dz >= 0 else tmp_dz+12
yuan = tmp_dz % 3
yuan = 0 if yuan == 0 else 3-yuan
liangyi = ""
qiju = 0
if jieqi in ybtext.jieqi_yang:
liangyi = "阳"
qiju = (ybtext.jieqi_yang[jieqi] + 6*yuan - 1) % 9 + 1
elif jieqi in ybtext.jieqi_yin:
liangyi = "阴"
qiju = (ybtext.jieqi_yin[jieqi] + 3*yuan - 1) % 9 + 1
dipan = ["囗"]*10
ct = 4
cur_gong = qiju # 当前宫1-9
step_gong = 1 if liangyi == "阳" else -1
while ct > 0:
if ct > 9:
ct = 3
dipan[cur_gong] = ybtext.tiangan[ct]
if ct >= 4:
ct += 1
else:
ct -= 1
cur_gong += step_gong
if cur_gong > 9:
cur_gong -= 9
elif cur_gong < 1:
cur_gong += 9
id_xunshou = dizhi_time - \
tiangan_time if dizhi_time >= tiangan_time else dizhi_time + 12 - tiangan_time
dunjia = {0: 4, 10: 5, 8: 6, 6: 7, 4: 8, 2: 9}
id_dun = dunjia[id_xunshou]
gong_zhifu = dipan.index(ybtext.tiangan[id_dun])
zhifu = ybtext.jiuxing[gong_zhifu]
zhishi = ybtext.bamen[gong_zhifu]
gong_cur_fu = dipan.index(
ybtext.tiangan[tiangan_time]) if tiangan_time != 0 else gong_zhifu
gong_cur_shi = (gong_zhifu + tiangan_time - 1) % 9 + \
1 if liangyi == '阳' else (
gong_zhifu + 9 - tiangan_time - 1) % 9 + 1
next_gong = {1: 8, 2: 7, 3: 4, 4: 9, 5: 0, 6: 1, 7: 6, 8: 3, 9: 2}
ct = 0
tianpan = ["囗"]*10
igong = gong_cur_fu if gong_cur_fu != 5 else 2
ixing = gong_zhifu if gong_zhifu != 5 else 2
while ct < 8:
tianpan[igong] = ybtext.jiuxing[ixing]
igong = next_gong[igong]
ixing = next_gong[ixing]
ct += 1
tianpan[5] = ybtext.jiuxing[5]
ct = 0
tianpan2 = dipan.copy()
igong = gong_cur_fu if gong_cur_fu != 5 else 2
ixing = gong_zhifu if gong_zhifu != 5 else 2
while ct < 8:
tianpan2[igong] = dipan[ixing]
igong = next_gong[igong]
ixing = next_gong[ixing]
ct += 1
ct = 0
renpan = ["囗"]*10
igong = gong_cur_shi if gong_cur_shi != 5 else 2
imen = gong_zhifu if gong_zhifu != 5 else 2
while ct < 8:
renpan[igong] = ybtext.bamen[imen]
igong = next_gong[igong]
imen = next_gong[imen]
ct += 1
ct = 0
shenpan = ["囗"]*10
igong = gong_cur_fu if gong_cur_fu != 5 else 2
ishen = 1
shenjiang = ybtext.shen_yang if liangyi == "阳" else ybtext.shen_yin
while ct < 8:
shenpan[igong] = shenjiang[ishen]
igong = next_gong[igong]
ishen = next_gong[ishen]
ct += 1
shenpan[5] = shenjiang[5]
asw += "\t" + ybtext.msg_bagua[0].format(jieqi, ybtext.yuan[yuan])
asw += "\n" + ybtext.msg_bagua[1].format(liangyi, qiju)
asw += "\n" + ybtext.msg_bagua[3].format(zhifu, zhishi)
asw += "\n" + ybtext.msg_bagua[2].format(
dipan[4], dipan[9], dipan[2], dipan[3], dipan[5], dipan[7], dipan[8], dipan[1], dipan[6])
asw += "\n" + ybtext.msg_bagua[4].format(tianpan2[4]+tianpan[4], tianpan2[9]+tianpan[9], tianpan2[2]+tianpan[2], tianpan2[3]+tianpan[3],
tianpan2[5]+tianpan[5], tianpan2[7]+tianpan[7], tianpan2[8]+tianpan[8], tianpan2[1]+tianpan[1], tianpan2[6]+tianpan[6])
asw += "\n" + ybtext.msg_bagua[5].format(
renpan[4], renpan[9], renpan[2], renpan[3], renpan[5], renpan[7], renpan[8], renpan[1], renpan[6])
asw += "\n" + ybtext.msg_bagua[6].format(shenpan[4], shenpan[9], shenpan[2],
shenpan[3], shenpan[5], shenpan[7], shenpan[8], shenpan[1], shenpan[6])
jxlist = set()
jimen = (ybtext.bamen[1], ybtext.bamen[8], ybtext.bamen[6])
sanqi = (ybtext.tiangan[1], ybtext.tiangan[2], ybtext.tiangan[3])
def judge(gong, diqi, tianqi, tianxing, men, shen) -> str:
# print("gong,diqi,tianqi,tianxing,men,shen",gong,diqi,tianqi,tianxing,men,shen)
ifqmds = False
ifbad = False
if (diqi in sanqi or tianqi in sanqi) and men in jimen and (men == zhishi or tianxing == zhifu):
print('qmds:', gong)
print(gong, diqi, tianqi, tianxing, men, shen)
jxlist.add(ybtext.msg_qmdj[0].format(gong))
ifqmds = True
if diqi == ybtext.tiangan[3] and men == zhishi:
jxlist.add(ybtext.msg_qmdj[1])
if men == zhishi and gong == gong_zhifu:
jxlist.add(ybtext.msg_qmdj[2])
ifbad = True
if men == zhishi and (gong if gong != 5 else 2) + (gong_zhifu if gong_zhifu != 5 else 2) == 10:
jxlist.add(ybtext.msg_qmdj[3])
ifbad = True
if tianxing == zhifu and gong == gong_zhifu:
jxlist.add(ybtext.msg_qmdj[4])
ifbad = True
if tianxing == zhifu and (gong if gong != 5 else 2) + (gong_zhifu if gong_zhifu != 5 else 2) == 10:
jxlist.add(ybtext.msg_qmdj[5])
ifbad = True
mu = {ybtext.tiangan[1]: 2,
ybtext.tiangan[2]: 6, ybtext.tiangan[3]: 8}
if gday in sanqi and gday == tianqi and gong == mu[tianqi]:
jxlist.add(ybtext.msg_qmdj[6])
ifbad = True
shimu = [ybtext.tiangan[2]+ybtext.dizhi[10], ybtext.tiangan[8]+ybtext.dizhi[4], ybtext.tiangan[3]+ybtext.dizhi[1],
ybtext.tiangan[9]+ybtext.dizhi[7], ybtext.tiangan[4]+ybtext.dizhi[10], ybtext.tiangan[5]+ybtext.dizhi[1]]
if gztime in shimu:
jxlist.add(ybtext.msg_qmdj[7])
ifbad = True
wbys = {ybtext.tiangan[0]: ybtext.dizhi[6], ybtext.tiangan[1]: ybtext.dizhi[5], ybtext.tiangan[2]: ybtext.dizhi[4], ybtext.tiangan[3]: ybtext.dizhi[3], ybtext.tiangan[4]: ybtext.dizhi[2],
ybtext.tiangan[5]: ybtext.dizhi[1], ybtext.tiangan[6]: ybtext.dizhi[0], ybtext.tiangan[7]: ybtext.dizhi[9], ybtext.tiangan[8]: ybtext.dizhi[8], ybtext.tiangan[9]: ybtext.dizhi[7]}
if wbys[gday] == ybtext.dizhi[dizhi_time]:
jxlist.add(ybtext.msg_qmdj[8])
ifbad = True
if tianqi in sanqi and men in jimen:
if shen == ybtext.shen_yang[3]:
jxlist.add(ybtext.msg_qmdj[9].format(gong))
if shen == ybtext.shen_yang[7]:
jxlist.add(ybtext.msg_qmdj[10].format(gong))
if shen == ybtext.shen_yang[4]:
jxlist.add(ybtext.msg_qmdj[11].format(gong))
if tianqi == ybtext.tiangan[2] and men == ybtext.bamen[8]:
if shen == ybtext.shen_yang[6]:
jxlist.add(ybtext.msg_qmdj[12].format(gong))
elif diqi == ybtext.tiangan[3]:
jxlist.add(ybtext.msg_qmdj[13].format(gong))
if tianqi == ybtext.tiangan[1]:
if men == ybtext.bamen[6] and diqi == ybtext.tiangan[5]:
jxlist.add(ybtext.msg_qmdj[14].format(gong))
elif men == ybtext.bamen[1] and gong in (8, 4):
jxlist.add(ybtext.msg_qmdj[15].format(gong))
elif men == ybtext.bamen[4] and shen == ybtext.shen_yang[7]:
jxlist.add(ybtext.msg_qmdj[16].format(gong))
elif men in jimen:
if gong == 4:
jxlist.add(ybtext.msg_qmdj[17].format(gong))
if diqi == ybtext.tiangan[7]:
jxlist.add(ybtext.msg_qmdj[18].format(gong))
if gong == 1:
jxlist.add(ybtext.msg_qmdj[19].format(gong))
if tianqi == ybtext.tiangan[3] and men == ybtext.bamen[1] and shen == ybtext.shen_yang[3]:
jxlist.add(ybtext.msg_qmdj[20].format(gong))
return ifqmds, ifbad
for i in range(1, 10):
idiqi = dipan[i]
itianqi = tianpan2[i]
itianxing = tianpan[i]
imen = renpan[i]
ishen = shenpan[i]
if i == 5:
itianqi = tianpan2[2]
itianxing = tianpan[2]
affix = judge(i, idiqi, itianqi, itianxing, imen, ishen)
ifqmds = ifqmds or affix[0]
ifbad = ifbad or affix[1]
if itianxing == ybtext.jiuxing[2]:
affix = judge(
i, idiqi, tianpan2[5], tianpan[5], imen, ishen)
ifqmds = ifqmds or affix[0]
ifbad = ifbad or affix[1]
asw += "\n" + ",".join(jxlist)
except Exception as e:
print(e)
if isinstance(e, socket.timeout):
asw = self.random_str(ybtext.msg_timeout)
finally:
if httpClient:
httpClient.close()
return asw, ifqmds and (not ifbad), '{} {:0>2d}:00:00'.format(date_q, hour)