python闰月计算_Python实现150年公历农历换算

刻很简单,就是一天对应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&lt0:

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&lt0:

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年,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值