阳历转换为农历程序

 阳历转化为农历,因为农历的节气具体精确到是哪一天,是一个很复杂的算法,涉及到天文学计算。

因此很多计算数据都来源于天文台的数据。

程序代码的核心其实就是查表法。

作为程序学习,其他年份的数据未完整收入。可自行去补充

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
    功能:对录入的日期进行分析星期几、农历、节气

    环境:python3.7
    日期:2020/2/10 19:36
    作者:指尖魔法师
    版本:1.0
"""

import datetime
import calendar

#******************************************************************************
# 下面为阴历计算所需的数据,为节省存储空间,所以采用下面比较变态的存储方法.
#******************************************************************************

#数组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, 0x00,   #2030
    0x30, 0xb0, 0x06, 0x00, 0x50,   #2040
    0x02, 0x07, 0x00, 0x50, 0x03    #2050
]

"""
二十四节气数据库(2000--2100)
数据格式说明:  
每个月对应2个节气,以下表是按节气顺序排 
小寒大寒立春雨水惊蛰春分清明谷雨立夏小满芒种夏至小暑大暑立秋处暑白露秋分寒露霜降立冬小雪大雪冬至
如2000年
1月6、21为小寒大寒
"""
g_jieqi = [
    0x06, 0x15, 0x04, 0x13, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2000
    0x05, 0x14, 0x04, 0x12, 0x05, 0x14, 0x05, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x17, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2001
    0x05, 0x14, 0x04, 0x13, 0x06, 0x15, 0x05, 0x14, 0x06, 0x15, 0x06, 0x15, 0x07, 0x17, 0x08, 0x17, 0x08, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2002
    0x06, 0x14, 0x04, 0x13, 0x06, 0x15, 0x05, 0x14, 0x06, 0x15, 0x06, 0x16, 0x07, 0x17, 0x08, 0x17, 0x08, 0x17, 0x09, 0x18, 0x08, 0x17, 0x07, 0x16,  #2003
    0x06, 0x15, 0x04, 0x13, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2004
    0x05, 0x14, 0x04, 0x12, 0x05, 0x14, 0x05, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x17, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2005
    0x05, 0x14, 0x04, 0x13, 0x06, 0x15, 0x05, 0x14, 0x05, 0x15, 0x06, 0x15, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2006
    0x06, 0x14, 0x04, 0x13, 0x06, 0x15, 0x05, 0x14, 0x06, 0x15, 0x06, 0x16, 0x07, 0x17, 0x08, 0x17, 0x08, 0x17, 0x09, 0x18, 0x08, 0x17, 0x07, 0x16,  #2007
    0x06, 0x15, 0x04, 0x13, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2008
    0x05, 0x14, 0x04, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x17, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2009
    0x05, 0x14, 0x04, 0x13, 0x06, 0x15, 0x05, 0x14, 0x05, 0x15, 0x06, 0x15, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2010
    0x06, 0x14, 0x04, 0x13, 0x06, 0x15, 0x05, 0x14, 0x06, 0x15, 0x06, 0x16, 0x07, 0x17, 0x08, 0x17, 0x08, 0x17, 0x08, 0x18, 0x08, 0x17, 0x07, 0x16,  #2011
    0x06, 0x15, 0x04, 0x13, 0x05, 0x14, 0x04, 0x14, 0x05, 0x14, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2012
    0x05, 0x14, 0x04, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2013
    0x05, 0x14, 0x04, 0x13, 0x06, 0x15, 0x05, 0x14, 0x05, 0x15, 0x06, 0x15, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2014
    0x06, 0x14, 0x04, 0x13, 0x06, 0x15, 0x05, 0x14, 0x06, 0x15, 0x06, 0x16, 0x07, 0x17, 0x08, 0x17, 0x08, 0x17, 0x08, 0x18, 0x08, 0x16, 0x07, 0x16,  #2015
    0x06, 0x14, 0x04, 0x13, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2016
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2017
    0x05, 0x14, 0x04, 0x13, 0x05, 0x15, 0x05, 0x14, 0x05, 0x15, 0x06, 0x15, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2018
    0x05, 0x14, 0x04, 0x13, 0x06, 0x15, 0x05, 0x14, 0x06, 0x15, 0x06, 0x15, 0x07, 0x17, 0x08, 0x17, 0x08, 0x17, 0x08, 0x18, 0x08, 0x16, 0x07, 0x16,  #2019
    0x06, 0x14, 0x04, 0x13, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2020
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2021
    0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x14, 0x05, 0x15, 0x06, 0x15, 0x07, 0x17, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2022
    0x05, 0x14, 0x04, 0x13, 0x06, 0x15, 0x05, 0x14, 0x06, 0x15, 0x06, 0x15, 0x07, 0x17, 0x08, 0x17, 0x08, 0x17, 0x08, 0x18, 0x08, 0x16, 0x07, 0x16,  #2023
    0x06, 0x14, 0x04, 0x13, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x06, 0x15,  #2024
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2025
    0x05, 0x14, 0x04, 0x12, 0x05, 0x14, 0x05, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x17, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2026
    0x05, 0x14, 0x04, 0x13, 0x06, 0x15, 0x05, 0x14, 0x06, 0x15, 0x06, 0x15, 0x07, 0x17, 0x08, 0x17, 0x08, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2027
    0x06, 0x14, 0x04, 0x13, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x06, 0x15,  #2028
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2029
    0x05, 0x14, 0x04, 0x12, 0x05, 0x14, 0x05, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x17, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2030
    0x05, 0x14, 0x04, 0x13, 0x06, 0x15, 0x05, 0x14, 0x06, 0x15, 0x06, 0x15, 0x07, 0x17, 0x08, 0x17, 0x08, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2031
    0x06, 0x14, 0x04, 0x13, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x06, 0x15,  #2032
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2033
    0x05, 0x14, 0x04, 0x12, 0x05, 0x14, 0x05, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x17, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2034
    0x05, 0x14, 0x04, 0x13, 0x06, 0x15, 0x05, 0x14, 0x05, 0x15, 0x06, 0x15, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2035
    0x06, 0x14, 0x04, 0x13, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x06, 0x15,  #2036
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2037
    0x05, 0x14, 0x04, 0x12, 0x05, 0x14, 0x05, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x17, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2038
    0x05, 0x14, 0x04, 0x13, 0x05, 0x15, 0x05, 0x14, 0x05, 0x15, 0x06, 0x15, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2039
    0x06, 0x14, 0x04, 0x13, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x06, 0x15,  #2040
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x14, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2041
    0x05, 0x14, 0x04, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x17, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2042
    0x05, 0x14, 0x04, 0x13, 0x06, 0x15, 0x05, 0x14, 0x05, 0x15, 0x06, 0x15, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2043
    0x06, 0x14, 0x04, 0x13, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x07, 0x17, 0x07, 0x16, 0x06, 0x15,  #2044
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2045
    0x05, 0x14, 0x04, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2046
    0x05, 0x14, 0x04, 0x13, 0x06, 0x15, 0x05, 0x14, 0x05, 0x15, 0x06, 0x15, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2047
    0x06, 0x14, 0x04, 0x13, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x14, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x07, 0x17, 0x07, 0x15, 0x06, 0x15,  #2048
    0x05, 0x13, 0x03, 0x12, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2049
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2050
    0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x14, 0x05, 0x15, 0x06, 0x15, 0x07, 0x17, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2051
    0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x14, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x07, 0x17, 0x07, 0x15, 0x06, 0x15,  #2052
    0x05, 0x13, 0x03, 0x12, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2053
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2054
    0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x17, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2055
    0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x14, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x07, 0x17, 0x07, 0x15, 0x06, 0x15,  #2056
    0x05, 0x13, 0x03, 0x12, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x06, 0x15,  #2057
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2058
    0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x17, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2059
    0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x14, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x07, 0x16, 0x06, 0x15, 0x06, 0x15,  #2060
    0x05, 0x13, 0x03, 0x12, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x06, 0x15,  #2061
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2062
    0x05, 0x14, 0x04, 0x12, 0x05, 0x14, 0x05, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x17, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2063
    0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x14, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x07, 0x16, 0x06, 0x15, 0x06, 0x15,  #2064
    0x05, 0x13, 0x03, 0x12, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x06, 0x15,  #2065
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2066
    0x05, 0x14, 0x04, 0x12, 0x05, 0x14, 0x05, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x17, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2067
    0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x04, 0x13, 0x04, 0x14, 0x05, 0x14, 0x06, 0x16, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x06, 0x15, 0x06, 0x15,  #2068
    0x05, 0x13, 0x03, 0x12, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x06, 0x15,  #2069
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x14, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2070
    0x05, 0x14, 0x04, 0x12, 0x05, 0x14, 0x05, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x17, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2071
    0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x04, 0x13, 0x04, 0x14, 0x05, 0x14, 0x06, 0x16, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x06, 0x15, 0x06, 0x15,  #2072
    0x05, 0x13, 0x03, 0x12, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x07, 0x17, 0x07, 0x16, 0x06, 0x15,  #2073
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x14, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2074
    0x05, 0x14, 0x04, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2075
    0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x04, 0x13, 0x04, 0x14, 0x05, 0x14, 0x06, 0x16, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x06, 0x15, 0x06, 0x15,  #2076
    0x05, 0x13, 0x03, 0x12, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x07, 0x17, 0x07, 0x16, 0x06, 0x15,  #2077
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x17, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2078
    0x05, 0x14, 0x04, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2079
    0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x04, 0x13, 0x04, 0x14, 0x05, 0x14, 0x06, 0x16, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x06, 0x15, 0x06, 0x15,  #2080
    0x05, 0x13, 0x03, 0x12, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x14, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x07, 0x17, 0x07, 0x15, 0x06, 0x15,  #2081
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2082
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2083
    0x05, 0x14, 0x04, 0x13, 0x04, 0x13, 0x04, 0x13, 0x04, 0x14, 0x05, 0x14, 0x06, 0x16, 0x06, 0x16, 0x06, 0x16, 0x07, 0x16, 0x06, 0x15, 0x06, 0x15,  #2084
    0x04, 0x13, 0x03, 0x12, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x14, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x07, 0x17, 0x07, 0x15, 0x06, 0x15,  #2085
    0x05, 0x13, 0x03, 0x12, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2086
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x16,  #2087
    0x05, 0x14, 0x04, 0x13, 0x04, 0x13, 0x04, 0x13, 0x04, 0x14, 0x04, 0x14, 0x06, 0x16, 0x06, 0x16, 0x06, 0x16, 0x07, 0x16, 0x06, 0x15, 0x06, 0x15,  #2088
    0x04, 0x13, 0x03, 0x12, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x14, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x07, 0x17, 0x07, 0x15, 0x06, 0x15,  #2089
    0x05, 0x13, 0x03, 0x12, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x06, 0x15,  #2090
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2091
    0x05, 0x14, 0x04, 0x13, 0x04, 0x13, 0x04, 0x13, 0x04, 0x14, 0x04, 0x14, 0x06, 0x16, 0x06, 0x16, 0x06, 0x16, 0x07, 0x16, 0x06, 0x15, 0x06, 0x15,  #2092
    0x04, 0x13, 0x03, 0x12, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x14, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x07, 0x16, 0x06, 0x15, 0x06, 0x15,  #2093
    0x05, 0x13, 0x03, 0x12, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x06, 0x15,  #2094
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2095
    0x05, 0x14, 0x04, 0x12, 0x04, 0x13, 0x04, 0x13, 0x04, 0x14, 0x04, 0x14, 0x06, 0x16, 0x06, 0x16, 0x06, 0x16, 0x07, 0x16, 0x06, 0x15, 0x06, 0x15,  #2096
    0x04, 0x13, 0x03, 0x12, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x14, 0x06, 0x16, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x06, 0x15, 0x06, 0x15,  #2097
    0x05, 0x13, 0x03, 0x12, 0x05, 0x14, 0x04, 0x13, 0x05, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x16, 0x07, 0x16, 0x08, 0x17, 0x07, 0x16, 0x06, 0x15,  #2098
    0x05, 0x14, 0x03, 0x12, 0x05, 0x14, 0x04, 0x14, 0x05, 0x15, 0x05, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x17, 0x08, 0x17, 0x07, 0x16, 0x07, 0x15,  #2099
]

START_YEAR = 1901
END_YEAR = 2050

# 1901-1-1,日干支为己卯【5,3】

# 天干
gan = '甲乙丙丁戊己庚辛壬癸'
# 地支
zhi = '子丑寅卯辰巳午未申酉戌亥'
# 生肖
xiao = '鼠牛虎兔龙蛇马羊猴鸡狗猪'
# 年份
nn = "零一二三四五六七八九"
# 月份
nm = '正二三四五六七八九十冬腊'
# 日份
nd = '初一初二初三初四初五初六初七初八初九初十十一十二十三十四十五十六十七十八十九二十廿一廿二廿三廿四廿五廿六廿七廿八廿九三十'
# 节气
jie = '小寒大寒立春雨水惊蛰春分清明谷雨立夏小满芒种夏至小暑大暑立秋处暑白露秋分寒露霜降立冬小雪大雪冬至'
# 星期
weekday_str = "一二三四五六日"

def input_date():
    """输入日期"""
    while(1):
        print("请输入公历2000-1-1到2050-12-31直接的日期:(年份4份)")
        try:
            yl_year = int(input("年:"))
            yl_month = int(input("月:"))
            yl_day = int(input("日:"))

            if (datetime.date(yl_year, yl_month, yl_day) - datetime.date(2000, 1, 1)).days < 0 \
                    or (datetime.date(yl_year, yl_month, yl_day) - datetime.date(END_YEAR, 12, 31)).days > 0:
                print("输入日期错误,请输入错误!")
            else:
                break
        except:
            print("输入日期错误,请输入错误!")
    return yl_year, yl_month, yl_day

def yangli_dateinfo(yl_year, yl_month, yl_day):
    """分析公历日期信息"""
    # 判断该日期为星期几
    print("{0}年{1}月{2}日是星期{3}".format(yl_year, yl_month, yl_day, weekday_str[calendar.weekday(yl_year, yl_month, yl_day)]))

    # 判断该年是否为闰年
    if calendar.isleap(yl_year):
        print("{}是闰年".format(yl_year))
    else:
        print("{}不是闰年".format(yl_year))

    # 打印该月日历表
    cal = calendar.month(yl_year, yl_month)
    print(cal)

def search_year_days(diff_days, nl_year):
    """按年月查表扣减天数,查到需要查询的日期"""
    # 判断这一年是不是有闰月,闰月是哪个月,0为没有闰月
    if nl_year % 2 == 1:
        leap_month = g_lunar_month[int((nl_year-START_YEAR)/2)] >> 4
    else:
        leap_month = g_lunar_month[int((nl_year-START_YEAR)/2)] & 0x0F
    # 有闰月读取12个月,没闰月读取13个月
    m_year = 12 if leap_month == 0 else 13

    # 判断这一年所有月份的大小月和闰月标记
    m = 0
    for i in range(m_year):
        # 判断这个月是不是闰月
        month_str = ''
        m += 1
        if i == leap_month and m_year == 13:
            month_str = '闰'
            m -= 1

        # 判断大小月
        if (g_lunar_month_day[nl_year-START_YEAR] & (0x8000 >> i)) == (0x8000 >> i):
            month_days = 30
        else:
            month_days = 29

        if diff_days-month_days >= 0:
            diff_days -= month_days
        else:
            month_str = month_str + nm[m - 1]
            return diff_days, month_str, nl_year, 1
    return diff_days, '', nl_year, 0

def nl_date(yl_year, yl_month, yl_day):
    """分析农历日期信息"""
    nl_year = 0
    diff_days = (datetime.date(yl_year, yl_month, yl_day)-datetime.date(START_YEAR, 1, 1)).days

    # 阳历1901年2月19日为阴历1901年正月初一,共49天
    diff_days -= 49

    # 按年查表
    flag = 0
    year = 0
    month_str = ''
    for i in range(START_YEAR, END_YEAR+1):
        diff_days, month_str, year, flag = search_year_days(diff_days, i)

        # 找到该日期
        if flag == 1:
            nl_year = year
            break
    if flag == 1:
        #year_str = nn[int(year/1000)]+nn[int(year/100)%10]+nn[int(year/10)%10]+nn[year%10]
        print(ganzhi_year(year)+month_str+'月'+nd[diff_days*2]+nd[diff_days*2+1])
    else:
        print("未找到该日期")
    return nl_year, month_str

def ganzhi_year(nl_year):
    """计算年干支和生肖"""
    #有人把第一个甲子年定在公元前2696年,与公元相比较,公元4年的干支正是农历甲子年
    return gan[(nl_year-4) % 10]+zhi[(nl_year-4) % 12]+"年"

def xiao_year(nl_year):
    """打印生肖"""
    print("【{}年】".format(xiao[(nl_year-4) % 12]))

def ganzhi_month(yl_year, yl_month, yl_day):
    """计算月干支"""
    # 这一年的二十四节气日期
    jieqi_year = g_jieqi[(yl_year-2000)*24:(yl_year-2000)*24+24]
    # print(jieqi_year)

    # 立春这天为新一年的干支月开始,每个节为一个干支月开始
    # 求立春月干支,干通过年计算,支从寅开始
    gan1 = ((yl_year - 4) % 5 * 2 + 2) % 10
    zhi1 = 2

    # 求立春月之后的月干支
    for i in range(3, 13):
        if datetime.date(yl_year, yl_month, yl_day) >= datetime.date(yl_year, i, jieqi_year[(i-1)*2]):
            gan1 += 1
            zhi1 += 1

    # 求立春月之前的月干支
    if datetime.date(yl_year, yl_month, yl_day) < datetime.date(yl_year, 1, jieqi_year[0]):
        gan1 -= 2
        zhi1 -= 2
    if datetime.date(yl_year, yl_month, yl_day) < datetime.date(yl_year, 2, jieqi_year[2])\
            and datetime.date(yl_year, yl_month, yl_day) >= datetime.date(yl_year, 1, jieqi_year[0]):
        gan1 -= 1
        zhi1 -= 1

    print(gan[gan1 % 10]+zhi[zhi1 % 12]+'月')

def ganzhi_day(yl_year, yl_month, yl_day):
    """计算日干支"""
    diff_days = (datetime.date(yl_year, yl_month, yl_day) - datetime.date(START_YEAR, 1, 1)).days
    ganzhi_day_str = gan[(diff_days % 10 +5) % 10]+zhi[(diff_days % 12 + 3) % 12]
    print(ganzhi_day_str+"日")

def get_jieqi(yl_year, yl_month, yl_day):
    # 这一年的二十四节气日期
    jieqi_year = g_jieqi[(yl_year-2000)*24:(yl_year-2000)*24+24]

    # 判断日期是不是该月的节气日期
    jieqi_index = -1
    if yl_day == jieqi_year[(yl_month-1)*2]:
        jieqi_index = (yl_month - 1) * 2
    elif yl_day == jieqi_year[(yl_month-1)*2+1]:
        jieqi_index = (yl_month - 1) * 2 + 1

    print(jie[jieqi_index*2:jieqi_index*2+2])


def main():
    # 输入日期
    yl_year, yl_month, yl_day = input_date()

    # 打印阳历日期信息
    print("*"*10+"打印阳历信息"+"*"*10)
    yangli_dateinfo(yl_year, yl_month, yl_day)

    print("*" * 10 + "打印农历信息" + "*" * 10)
    # 打印农历日期信息,并返回农历年份
    nl_year, month_str = nl_date(yl_year, yl_month, yl_day)
    print("\n", end="")

    # 打印干支信息
    print("*" * 10 + "打印干支信息" + "*" * 10)
    print(ganzhi_year(nl_year))

    # 月干支
    ganzhi_month(yl_year, yl_month, yl_day)

    # 干支日
    ganzhi_day(yl_year, yl_month, yl_day)

    # 打印生肖
    xiao_year(nl_year)

    # 打印节气
    get_jieqi(yl_year, yl_month, yl_day)


if __name__ == '__main__':
    main()


 

发布了37 篇原创文章 · 获赞 12 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章