在写一个python项目时,需要实现公历转换成农历,并且要实现计算出干支,实际就是农历的八字!!!
先科普一下,中国传统中的生辰八字其实就是你的农历日期的另一种表达。
举个例子:
公历日期 2019-07-16 北京时间 10:50:15
农历日期 2019年 六月 十四 10:50:15
对应八字: 己亥 辛未 甲寅 己巳
其中:
己 、亥 分别是年的干和支
辛、未 分别是月的干和支
甲、寅 分别是日的干和支
己、巳 分别是时的干和支
不得不佩服老祖宗还是很厉害的,在古代能研究出一套这么复杂的计时规则。干,又叫天干,有十个字;支,即地支有十二个字,有六十种组合,六十年一个循环,也就是常说的六十年一道轮回,终于明白咋回事了,哈哈。
天干: '甲乙丙丁戊己庚辛壬癸'
地支:'子丑寅卯辰巳午未申酉戌亥'
其中,年干支和日的干支的计算都有比较直接的规则,但是月干支的规则真的要复杂的多,还要看节气,节气还会影响年份,例如,有些年份腊月就立春,在计算月干支时,就得依据下一年的一月份(某度:月柱的依据是干支历的干支纪月。注意月干支不是以农历每月初一为分界线,而是以二十四节气的12个主气为准,交节前为上个月,交节后为下个月。)平时月份的计算也得考虑节气,从立春到惊蛰是一月,从惊蛰到清明是二月,所以跟实际的月份没有直接关系,没有直接关系!我晕,老祖宗是怎么设计的,尤其兵荒马乱的年代能记得住么!!!
月干支与年干的对应表,注意,月份,是依据节气定的月份,不能直接用农历的月:
![ae164d299958c34f9ac649982fedc8bf.png](https://i-blog.csdnimg.cn/blog_migrate/608009ba2e6e042db07010427a40e65f.jpeg)
当然,谈到了八字,就不得不提生辰五行,所以,还顺带实现了八字时辰五行的统计。
废话不说了,直接上干货吧:(也可以到我的github上下载)
HiGavin/Lunargithub.com![7964fa2d4506b566968c056a0a7699c3.png](https://i-blog.csdnimg.cn/blog_migrate/f4727b26fbd329e43fe03f3a760518e8.jpeg)
class Lunar(object):
# ******************************************************************************
# 下面为阴历计算所需的数据,为节省存储空间,所以采用下面比较变态的存储方法.
# ******************************************************************************
# 数组g_lunar_month_day存入阴历1901年到2050年每年中的月天数信息,
# 阴历每月只能是29或30天,一年用12(或13)个二进制位表示,对应位为1表30天,否则为29天
g_lunar_month_day = [
0x4ae0, 0xa570, 0x5268, 0xd260, 0xd950, 0x6aa8, 0x56a0, 0x9ad0, 0x4ae8, 0x4ae0, # 1910
0xa4d8, 0xa4d0, 0xd250, 0xd548, 0xb550, 0x56a0, 0x96d0, 0x95b0, 0x49b8, 0x49b0, # 1920
0xa4b0, 0xb258, 0x6a50, 0x6d40, 0xada8, 0x2b60, 0x9570, 0x4978, 0x4970, 0x64b0, # 1930
0xd4a0, 0xea50, 0x6d48, 0x5ad0, 0x2b60, 0x9370, 0x92e0, 0xc968, 0xc950, 0xd4a0, # 1940
0xda50, 0xb550, 0x56a0, 0xaad8, 0x25d0, 0x92d0, 0xc958, 0xa950, 0xb4a8, 0x6ca0, # 1950
0xb550, 0x55a8, 0x4da0, 0xa5b0, 0x52b8, 0x52b0, 0xa950, 0xe950, 0x6aa0, 0xad50, # 1960
0xab50, 0x4b60, 0xa570, 0xa570, 0x5260, 0xe930, 0xd950, 0x5aa8, 0x56a0, 0x96d0, # 1970
0x4ae8, 0x4ad0, 0xa4d0, 0xd268, 0xd250, 0xd528, 0xb540, 0xb6a0, 0x96d0, 0x95b0, # 1980
0x49b0, 0xa4b8, 0xa4b0, 0xb258, 0x6a50, 0x6d40, 0xada0, 0xab60, 0x9370, 0x4978, # 1990
0x4970, 0x64b0, 0x6a50, 0xea50, 0x6b28, 0x5ac0, 0xab60, 0x9368, 0x92e0, 0xc960, # 2000
0xd4a8, 0xd4a0, 0xda50, 0x5aa8, 0x56a0, 0xaad8, 0x25d0, 0x92d0, 0xc958, 0xa950, # 2010
0xb4a0, 0xb550, 0xb550, 0x55a8, 0x4ba0, 0xa5b0, 0x52b8, 0x52b0, 0xa930, 0x74a8, # 2020
0x6aa0, 0xad50, 0x4da8, 0x4b60, 0x9570, 0xa4e0, 0xd260, 0xe930, 0xd530, 0x5aa0, # 2030
0x6b50, 0x96d0, 0x4ae8, 0x4ad0, 0xa4d0, 0xd258, 0xd250, 0xd520, 0xdaa0, 0xb5a0, # 2040
0x56d0, 0x4ad8, 0x49b0, 0xa4b8, 0xa4b0, 0xaa50, 0xb528, 0x6d20, 0xada0, 0x55b0, # 2050
]
# 数组gLanarMonth存放阴历1901年到2050年闰月的月份,如没有则为0,每字节存两年
g_lunar_month = [
0x00, 0x50, 0x04, 0x00, 0x20, # 1910
0x60, 0x05, 0x00, 0x20, 0x70, # 1920
0x05, 0x00, 0x40, 0x02, 0x06, # 1930
0x00, 0x50, 0x03, 0x07, 0x00, # 1940
0x60, 0x04, 0x00, 0x20, 0x70, # 1950
0x05, 0x00, 0x30, 0x80, 0x06, # 1960
0x00, 0x40, 0x03, 0x07, 0x00, # 1970
0x50, 0x04, 0x08, 0x00, 0x60, # 1980
0x04, 0x0a, 0x00, 0x60, 0x05, # 1990
0x00, 0x30, 0x80, 0x05, 0x00, # 2000
0x40, 0x02, 0x07, 0x00, 0x50, # 2010
0x04, 0x09, 0x00, 0x60, 0x04, # 2020
0x00, 0x20, 0x60, 0x05,