陽曆轉換爲農曆程序

 陽曆轉化爲農曆,因爲農曆的節氣具體精確到是哪一天,是一個很複雜的算法,涉及到天文學計算。

因此很多計算數據都來源於天文臺的數據。

程序代碼的核心其實就是查表法。

作爲程序學習,其他年份的數據未完整收入。可自行去補充

#!/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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章