刻很简单,就是一天对应12个,直接对应就行。天干是10个,和地支组合起来则是60一循环,不能跟一天的12个时辰直接对应,所以就要取一个基准时刻,知道那个时刻的天干地支就可以根据60一循环的规律进行推算了。在这里我以1901年的1月1日凌成1点为基准点,此刻是乙丑时的开始,函数只做了向后计算,向前推算也很简单,稍改一下就可以。这里为最终返回干支结果,定义了几个常量,对应干支的汉字。
TIAN_GAN=("甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸")
DI_ZHI=("子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥")
HOUR_GANZHI={0:"子时", 1:"丑时", 2:"丑时", 3:"寅时", 4:"寅时", 5:"卯时", 6:"卯时", 7:"辰时", 8:"辰时", 9:"巳时", 10:"巳时", 11:"午时"\
, 12:"午时", 13:"未时", 14:"未时", 15:"申时", 16:"申时", 17:"酉时", 18:"酉时", 19:"戌时", 20:"戌时", 21:"亥时", 22:"亥时", 23:"子时", 24:"子时"}
def GetHourGanzhi1901(arg):
#以1901年1月1日凌晨一点为基准点
startdatetime=datetime.datetime(year=1901, month=1, day=1, hour=1)
#60干支乙丑是第二个,以0为起点,则编号为1
startganzhi=1
if not isinstance(arg, datetime.datetime):
return ""
#计算离基准时刻过去了多少时间
delta = arg - startdatetime
if delta.seconds<0:
return ""
#计算时刻的干支编号
hour=delta.days*24+delta.seconds/3600
num=(startganzhi+hour/2)%10
return TIAN_GAN[num]+HOUR_GANZHI[arg.hour]
2.日干支
日干支就是每天对应的天干地支表示,基本做法与时刻干支类似,也是以某一确定基准日期为起点,根据时间差来计算。这里同样也是以1901年1月1日为基准点,当天是乙卯日。
def GetDayGanzhiNum1901(arg):
#函数返回60干支编号,编号范围[1,60]
if not isinstance(arg, datetime.date):
return 0
startdate=datetime.date(1901,1,1)
startganzhi=16
if not isinstance(arg, datetime.date):
return 0
delta = arg - startdate
if delta.days + delta.seconds<0:
return ""
num=(startganzhi+delta.days)%60
if num == 0:
num=60
return num
获得编号后如需获取汉字表示,可以再写一个函数来做这种转换:
def Num2Ganzhi(arg):
#arg范围是[1,60]
if not arg in range(1, 61):
return ""
x=(arg-1)%10
y=(arg-1)%12
return TIAN_GAN[x]+DI_ZHI[y]
3.农历年份
农历年份的确定实际上就是要设法知道每年年初一在公历的哪天,上面提到这涉及到每年的闰月和大小月分布,如果不用复杂的天文计算的话只能是用查表的方式解决。我用的数据是从网上搜来的代码里的,是一位信箱是wangfei@hanwang.com.cn的朋友整理出来的,数据时间从1901年到2050年,