题目要求:用户输入生日,来得到其生辰八字
首先生辰八字分为四个部分,分别对应生日的四个部分,即年,月,日,时。并且由天干地支来组成。
十天干:甲,乙,丙,丁,戊,己,庚,辛,壬,癸
十二地支:子,丑,寅,卯,辰,巳,午,未,申,酉,戌,亥
由于每部分的干支最初的定位不同,所以我把每一部分都设置了自己的干支list
首先做准备工作,将用户输入的生日转化为农历
from zhdate import ZhDate
from datetime import datetime
birthday=input('请输入出生日期(Y/M/D/H):') #例:2022102321
dt_date = datetime(int(birthday[0:4]),int(birthday[4:6]),int(birthday[6:8]),int(birthday[8:]))
date = str(ZhDate.from_datetime(dt_date))
print(date)
用此方法即可得到生日的农历日期
一、年干支算法
tiangan_1=['庚','辛','壬','癸','甲','乙','丙','丁','戊','己']
dizhi_1=["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]
#输出年的天干和地支
a,b=0,0
year = int(date[2:6])
year-=1900
year%=60
for _ in range(year):
a+=1
b+=1
A = a % 10
B = b % 12
print(tiangan_1[A],dizhi_1[B])
二、月干支算法
tiangan_2=['甲','乙','丙','丁','戊','己','庚','辛','壬','癸']
dizhi_2=["寅","卯","辰","巳","午","未","申","酉","戌","亥","子","丑"]
if date[7] == 1 :
if date[8] in [1,2,0]:
month = int(date[7]+date[8])
else:
month = int(date[7])
#月干序
mon_gx = (int(date[5])-3)*2 + month
while mon_gx >10 :
mon_gx-=10
#月支序
mon_zx = month
print(mon_gx,mon_zx)
三、日干支算法
(因为日干支本身的特点,计算起来比较麻烦,该代码仅供大家参考)
tiangan_3 = ['甲','乙','丙','丁','戊','己','庚','辛','壬','癸']
dizhi_3 = ["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]
Day = int(birthday[6]+birthday[7])
Y_2=int(date[4:6])
F_day = ((Y_2+7)*5 + int((Y_2+19)/4) + 15) % 60
if (year % 4) == 0:
if (year % 100) == 0:
if (year % 400) == 0:
Feb = 29
else:
Feb = 28
else:
Feb = 29
else:
Feb = 28
mon = int(birthday[4:6])
if mon == 1:
N_day = (F_day + Day)%60
elif mon == 2:
N_day = (F_day + 31 + Day)%60
elif mon == 3:
N_day = (F_day + 31 + Feb + Day)%60
elif mon == 4:
N_day = (F_day + 31 + Feb + 31 + Day)%60
elif mon == 5:
N_day = (F_day + 31 + Feb + 31 + 30 + Day)%60
elif mon == 6:
N_day = (F_day + 31 + Feb + 31 + 30 + 31 + Day)%60
elif mon == 7:
N_day = (F_day + 31 + Feb + 31 + 30 + 31 + 30 + Day)%60
elif mon == 8:
N_day = (F_day + 31 + Feb + 31 + 30 + 31 + 30 + 31 + Day)%60
elif mon == 9:
N_day = (F_day + 31 + Feb + 31 + 30 + 31 + 30 + 31 + 31 + Day)%60
elif mon == 10:
N_day = (F_day + 31 + Feb + 31 + 30 + 31 + 30 + 31 + 31 + 30 + Day)%60
elif mon == 11:
N_day = (F_day + 31 + Feb + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + Day)%60
else :
N_day = (F_day + 31 + Feb + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + Day)%60
print(tiangan_3[N_day%10-1],dizhi_3[N_day%12-1])
四、时干支算法
tiangan_4 = ['甲','乙','丙','丁','戊','己','庚','辛','壬','癸']
dizhi_4 = ["丑","寅","卯","辰","巳","午","未","申","酉","戌","亥","子"]
H = int(birthday[8:10])
if H == 1 or H == 2:
H_dz = 1
elif H == 3 or H == 4:
H_dz = 2
elif H == 5 or H == 6:
H_dz = 3
elif H == 7 or H == 8:
H_dz = 4
elif H == 9 or H == 10:
H_dz = 5
elif H == 11 or H == 12:
H_dz = 6
elif H == 13 or H == 14:
H_dz = 7
elif H == 15 or H == 16:
H_dz = 8
elif H == 17 or H == 18:
H_dz = 9
elif H == 19 or H == 20:
H_dz = 10
elif H == 21 or H == 22:
H_dz = 11
else :
H_dz = 12
#时天干
H_tg = ((N_day%10) * 2 + int(H/2) - 1)%10
print(tiangan_4[H_tg-1],dizhi_4[H_dz-1])
综上即可得到对应的生辰八字!