数码之家

 找回密码
 立即注册
搜索
查看: 1750|回复: 36

[C51] 1901年~2099年公历转农历程序

[复制链接]
发表于 2024-10-22 12:50:37 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 mmxx2015 于 2024-10-22 18:10 编辑

搜索公历转农历方法时,多数结果使用的是查表法,即预置N年的农历特征数据,然后根据这些特征数据把N年内其中任意一天的公历转换为农历。

其中,找到的这篇文章的程序比较容易看懂:
公农历转换和获取二十四节气算法

https://blog.csdn.net/qq_46041930/article/details/108653836
文章中还有转换农历二十四节气和星期日,以下程序没有包含这两段,需要的可以查看原文。


实际测试也发现一些问题:
(1)农历特征表格有6年的数据错误。
  1. 1960年 闰六月
  2. 错误数据:{0x7A, 0xD5, 0x3C},    /* 060-1960 */
  3. 正确数据:{0x6A, 0xD5, 0x3C},    /* 060-1960 */

  4. 1989年 六月大,七月小
  5. 错误数据:{0x09, 0x37, 0x46},    /* 089-1989 */
  6. 正确数据:{0x09, 0x57, 0x46},    /* 089-1989 */
  7. 0x937=1001,0011,0111
  8. 0x957=1001,0101,0111

  9. 2025年 闰六月 三月大,四月小
  10. 错误数据:{0x69, 0x57, 0x3D},    /* 125-2025 */
  11. 正确数据:{0x6A, 0x57, 0x3D},    /* 125-2025 */
  12. 0x957=1001,0101,0111
  13. 0x95A=1010,0101,0111

  14. 2057年 八月小,九月大
  15. 错误数据:{0x06, 0xB2, 0x44},    /* 157-2057 */
  16. 正确数据:{0x06, 0xAA, 0x44},    /* 157-2057 */
  17. 0x6B2=0110,1011,0010
  18. 0x6AA=0110,1010,1010

  19. 2089年 七月小,八月大
  20. 错误数据:{0x0D, 0x26, 0x4A},    /* 189-2089 */
  21. 正确数据:{0x0D, 0x16, 0x4A},    /* 189-2089 */
  22. 0xD26=1101,0010,0110
  23. 0xD16=1101,0001,0110

  24. 2097年  六月小,七月大
  25. 错误数据:{0x0A, 0x4D, 0x4C},    /* 197-2097 */
  26. 正确数据:{0x0A, 0x2D, 0x4C},    /* 197-2097 */
  27. 0xA4D=1010,0100,1101
  28. 0xA2D=1010,0010,1101
复制代码
(2)表格少1900年,无法转换1901年春节前的农历(需要上一年的农历数据)。
(3)有农历闰月的年份,常规月和闰月均记为闰月,比如2025年六月和闰六月均记为闰月。

一下程序修正了上述问题,添加更详细的注释,部分数据使用结构体使之更容易理解。
经过把公历1901.1.1~2099.12.31转成农历串口输出与从农历查询网http://cn.nongli.info/提取的数据对比,数据一致(顺便说一下,我从网上下载的一份“公历农历对照表 ExcelHome”表格中1960年闰七月是错误的,1960年是闰六月,这份文件可能来着 ExcelHome,可能新版已修正,但因为要注册才能下载,所以未验证)。


程序组成(可按需放在一个或多个文件中):

  1. //******************************************************************
  2. //        结构体/联合体声明
  3. //******************************************************************

  4. //农历特征数据结构体
  5. typedef struct
  6. {
  7.         union
  8.         {
  9.                 unsigned char        V8;

  10.                 struct
  11.                 {
  12.                         unsigned char        Month_1_4_Long_Short:4;                //字节0 bit[3:0],农历第1-4月的大小
  13.                         unsigned char        Leap_Month:4;                        //字节0 bit[7:4],闰月月份,0表示无闰月
  14.                 }Bits;
  15.         }Byte_0;

  16.         unsigned char        Month_5_12_Long_Short;                                //字节1,农历第5-12月大小

  17.         union
  18.         {
  19.                 unsigned char        V8;

  20.                 struct
  21.                 {
  22.                         unsigned char        Spring_Festival_Date:5;                //字节2 bit[4:0],春节的公历日期
  23.                         unsigned char        Spring_Festival_Month:2;        //字节2 bit[6:5],春节的公历月份
  24.                         unsigned char        Month_13_Long_Short:1;                //字节2 bit7,农历第13个月大小
  25.                 }Bits;
  26.         }Byte_2;
  27. }Lunar_Year_Code_Typedef;


  28. //公历转农历返回数据结构体
  29. typedef struct
  30. {
  31.         unsigned char        Month:5;                //月
  32.         unsigned char        IS_Leap_Month:1;        //闰月标志
  33.         unsigned char        Reserved_Bits:2;
  34.         unsigned char        Date:8;                        //日
  35. }Solar2Lunar_Typedef;
复制代码
  1. //位值
  2. #define        BIT0        0x01
  3. #define        BIT1        0x02
  4. #define        BIT2        0x04
  5. #define        BIT3        0x08
  6. #define        BIT4        0x10
  7. #define        BIT5        0x20
  8. #define        BIT6        0x40
  9. #define        BIT7        0x80

  10. #define        BIT8        0x0100
  11. #define        BIT9        0x0200
  12. #define        BIT10        0x0400
  13. #define        BIT11        0x0800
  14. #define        BIT12        0x1000
  15. #define        BIT13        0x2000
  16. #define        BIT14        0x4000
  17. #define        BIT15        0x8000
复制代码
  1. //******************************************************************
  2. //* 公历与农历转换年份数据存储数组
  3. //* 公历年对应的农历数据,每年三字节,
  4. //* 格式第一字节BIT7-4 位表示闰月月份,值为0为无闰月,BIT3-0对应农历第1-4月的大小
  5. //* 第二字节BIT7-0对应农历第5-12月大小,第三字节BIT7表示农历第13个月大小
  6. //* 月份对应的位为1表示本农历月大(30天),为0表示小(29天).
  7. //* 第三字节BIT6-5表示春节的公历月份,BIT4-0表示春节的公历日期
  8. //******************************************************************
  9. //农历特征数据表格(1900年~2099年)
  10. Lunar_Year_Code_Typedef code Lunar_Year_Code[200] =
  11. {
  12.         {0x84, 0xB6, 0xBF},        /* 000-1900 */
  13.         {0x04, 0xAE, 0x53},        /* 001-1901 */
  14.         {0x0A, 0x57, 0x48},        /* 002-1902 */
  15.         {0x55, 0x26, 0xBD},        /* 003-1903 */
  16.         {0x0D, 0x26, 0x50},        /* 004-1904 */
  17.         {0x0D, 0x95, 0x44},        /* 005-1905 */
  18.         {0x46, 0xAA, 0xB9},        /* 006-1906 */
  19.         {0x05, 0x6A, 0x4D},        /* 007-1907 */
  20.         {0x09, 0xAD, 0x42},        /* 008-1908 */
  21.         {0x24, 0xAE, 0xB6},        /* 009-1909 */
  22.         {0x04, 0xAE, 0x4A},        /* 010-1910 */
  23.         {0x6A, 0x4D, 0xBE},        /* 011-1911 */
  24.         {0x0A, 0x4D, 0x52},        /* 012-1912 */
  25.         {0x0D, 0x25, 0x46},        /* 013-1913 */
  26.         {0x5D, 0x52, 0xBA},        /* 014-1914 */
  27.         {0x0B, 0x54, 0x4E},        /* 015-1915 */
  28.         {0x0D, 0x6A, 0x43},        /* 016-1916 */
  29.         {0x29, 0x6D, 0x37},        /* 017-1917 */
  30.         {0x09, 0x5B, 0x4B},        /* 018-1918 */
  31.         {0x74, 0x9B, 0xC1},        /* 019-1919 */
  32.         {0x04, 0x97, 0x54},        /* 020-1920 */
  33.         {0x0A, 0x4B, 0x48},        /* 021-1921 */
  34.         {0x5B, 0x25, 0xBC},        /* 022-1922 */
  35.         {0x06, 0xA5, 0x50},        /* 023-1923 */
  36.         {0x06, 0xD4, 0x45},        /* 024-1924 */
  37.         {0x4A, 0xDA, 0xB8},        /* 025-1925 */
  38.         {0x02, 0xB6, 0x4D},        /* 026-1926 */
  39.         {0x09, 0x57, 0x42},        /* 027-1927 */
  40.         {0x24, 0x97, 0xB7},        /* 028-1928 */
  41.         {0x04, 0x97, 0x4A},        /* 029-1929 */
  42.         {0x66, 0x4B, 0x3E},        /* 030-1930 */
  43.         {0x0D, 0x4A, 0x51},        /* 031-1931 */
  44.         {0x0E, 0xA5, 0x46},        /* 032-1932 */
  45.         {0x56, 0xD4, 0xBA},        /* 033-1933 */
  46.         {0x05, 0xAD, 0x4E},        /* 034-1934 */
  47.         {0x02, 0xB6, 0x44},        /* 035-1935 */
  48.         {0x39, 0x37, 0x38},        /* 036-1936 */
  49.         {0x09, 0x2E, 0x4B},        /* 037-1937 */
  50.         {0x7C, 0x96, 0xBF},        /* 038-1938 */
  51.         {0x0C, 0x95, 0x53},        /* 039-1939 */
  52.         {0x0D, 0x4A, 0x48},        /* 040-1940 */
  53.         {0x6D, 0xA5, 0x3B},        /* 041-1941 */
  54.         {0x0B, 0x55, 0x4F},        /* 042-1942 */
  55.         {0x05, 0x6A, 0x45},        /* 043-1943 */
  56.         {0x4A, 0xAD, 0xB9},        /* 044-1944 */
  57.         {0x02, 0x5D, 0x4D},        /* 045-1945 */
  58.         {0x09, 0x2D, 0x42},        /* 046-1946 */
  59.         {0x2C, 0x95, 0xB6},        /* 047-1947 */
  60.         {0x0A, 0x95, 0x4A},        /* 048-1948 */
  61.         {0x7B, 0x4A, 0xBD},        /* 049-1949 */
  62.         {0x06, 0xCA, 0x51},        /* 050-1950 */
  63.         {0x0B, 0x55, 0x46},        /* 051-1951 */
  64.         {0x55, 0x5A, 0xBB},        /* 052-1952 */
  65.         {0x04, 0xDA, 0x4E},        /* 053-1953 */
  66.         {0x0A, 0x5B, 0x43},        /* 054-1954 */
  67.         {0x35, 0x2B, 0xB8},        /* 055-1955 */
  68.         {0x05, 0x2B, 0x4C},        /* 056-1956 */
  69.         {0x8A, 0x95, 0x3F},        /* 057-1957 */
  70.         {0x0E, 0x95, 0x52},        /* 058-1958 */
  71.         {0x06, 0xAA, 0x48},        /* 059-1959 */
  72.         {0x6A, 0xD5, 0x3C},        /* 060-1960 */
  73.         {0x0A, 0xB5, 0x4F},        /* 061-1961 */
  74.         {0x04, 0xB6, 0x45},        /* 062-1962 */
  75.         {0x4A, 0x57, 0x39},        /* 063-1963 */
  76.         {0x0A, 0x57, 0x4D},        /* 064-1964 */
  77.         {0x05, 0x26, 0x42},        /* 065-1965 */
  78.         {0x3E, 0x93, 0x35},        /* 066-1966 */
  79.         {0x0D, 0x95, 0x49},        /* 067-1967 */
  80.         {0x75, 0xAA, 0xBE},        /* 068-1968 */
  81.         {0x05, 0x6A, 0x51},        /* 069-1969 */
  82.         {0x09, 0x6D, 0x46},        /* 070-1970 */
  83.         {0x54, 0xAE, 0xBB},        /* 071-1971 */
  84.         {0x04, 0xAD, 0x4F},        /* 072-1972 */
  85.         {0x0A, 0x4D, 0x43},        /* 073-1973 */
  86.         {0x4D, 0x26, 0xB7},        /* 074-1974 */
  87.         {0x0D, 0x25, 0x4B},        /* 075-1975 */
  88.         {0x8D, 0x52, 0xBF},        /* 076-1976 */
  89.         {0x0B, 0x54, 0x52},        /* 077-1977 */
  90.         {0x0B, 0x6A, 0x47},        /* 078-1978 */
  91.         {0x69, 0x6D, 0x3C},        /* 079-1979 */
  92.         {0x09, 0x5B, 0x50},        /* 080-1980 */
  93.         {0x04, 0x9B, 0x45},        /* 081-1981 */
  94.         {0x4A, 0x4B, 0xB9},        /* 082-1982 */
  95.         {0x0A, 0x4B, 0x4D},        /* 083-1983 */
  96.         {0xAB, 0x25, 0xC2},        /* 084-1984 */
  97.         {0x06, 0xA5, 0x54},        /* 085-1985 */
  98.         {0x06, 0xD4, 0x49},        /* 086-1986 */
  99.         {0x6A, 0xDA, 0x3D},        /* 087-1987 */
  100.         {0x0A, 0xB6, 0x51},        /* 088-1988 */
  101.         {0x09, 0x57, 0x46},        /* 089-1989 */
  102.         {0x54, 0x97, 0xBB},        /* 090-1990 */
  103.         {0x04, 0x97, 0x4F},        /* 091-1991 */
  104.         {0x06, 0x4B, 0x44},        /* 092-1992 */
  105.         {0x36, 0xA5, 0x37},        /* 093-1993 */
  106.         {0x0E, 0xA5, 0x4A},        /* 094-1994 */
  107.         {0x86, 0xB2, 0xBF},        /* 095-1995 */
  108.         {0x05, 0xAC, 0x53},        /* 096-1996 */
  109.         {0x0A, 0xB6, 0x47},        /* 097-1997 */
  110.         {0x59, 0x36, 0xBC},        /* 098-1998 */
  111.         {0x09, 0x2E, 0x50},        /* 099-1999 */
  112.         {0x0C, 0x96, 0x45},        /* 100-2000 */
  113.         {0x4D, 0x4A, 0xB8},        /* 101-2001 */
  114.         {0x0D, 0x4A, 0x4C},        /* 102-2002 */
  115.         {0x0D, 0xA5, 0x41},        /* 103-2003 */
  116.         {0x25, 0xAA, 0xB6},        /* 104-2004 */
  117.         {0x05, 0x6A, 0x49},        /* 105-2005 */
  118.         {0x7A, 0xAD, 0xBD},        /* 106-2006 */
  119.         {0x02, 0x5D, 0x52},        /* 107-2007 */
  120.         {0x09, 0x2D, 0x47},        /* 108-2008 */
  121.         {0x5C, 0x95, 0xBA},        /* 109-2009 */
  122.         {0x0A, 0x95, 0x4E},        /* 110-2010 */
  123.         {0x0B, 0x4A, 0x43},        /* 111-2011 */
  124.         {0x4B, 0x55, 0x37},        /* 112-2012 */
  125.         {0x0A, 0xD5, 0x4A},        /* 113-2013 */
  126.         {0x95, 0x5A, 0xBF},        /* 114-2014 */
  127.         {0x04, 0xBA, 0x53},        /* 115-2015 */
  128.         {0x0A, 0x5B, 0x48},        /* 116-2016 */
  129.         {0x65, 0x2B, 0xBC},        /* 117-2017 */
  130.         {0x05, 0x2B, 0x50},        /* 118-2018 */
  131.         {0x0A, 0x93, 0x45},        /* 119-2019 */
  132.         {0x47, 0x4A, 0xB9},        /* 120-2020 */
  133.         {0x06, 0xAA, 0x4C},        /* 121-2021 */
  134.         {0x0A, 0xD5, 0x41},        /* 122-2022 */
  135.         {0x24, 0xDA, 0xB6},        /* 123-2023 */
  136.         {0x04, 0xB6, 0x4A},        /* 124-2024 */
  137.         {0x6A, 0x57, 0x3D},        /* 125-2025 */
  138.         {0x0A, 0x4E, 0x51},        /* 126-2026 */
  139.         {0x0D, 0x26, 0x46},        /* 127-2027 */
  140.         {0x5E, 0x93, 0x3A},        /* 128-2028 */
  141.         {0x0D, 0x53, 0x4D},        /* 129-2029 */
  142.         {0x05, 0xAA, 0x43},        /* 130-2030 */
  143.         {0x36, 0xB5, 0x37},        /* 131-2031 */
  144.         {0x09, 0x6D, 0x4B},        /* 132-2032 */
  145.         {0xB4, 0xAE, 0xBF},        /* 133-2033 */
  146.         {0x04, 0xAD, 0x53},        /* 134-2034 */
  147.         {0x0A, 0x4D, 0x48},        /* 135-2035 */
  148.         {0x6D, 0x25, 0xBC},        /* 136-2036 */
  149.         {0x0D, 0x25, 0x4F},        /* 137-2037 */
  150.         {0x0D, 0x52, 0x44},        /* 138-2038 */
  151.         {0x5D, 0xAA, 0x38},        /* 139-2039 */
  152.         {0x0B, 0x5A, 0x4C},        /* 140-2040 */
  153.         {0x05, 0x6D, 0x41},        /* 141-2041 */
  154.         {0x24, 0xAD, 0xB6},        /* 142-2042 */
  155.         {0x04, 0x9B, 0x4A},        /* 143-2043 */
  156.         {0x7A, 0x4B, 0xBE},        /* 144-2044 */
  157.         {0x0A, 0x4B, 0x51},        /* 145-2045 */
  158.         {0x0A, 0xA5, 0x46},        /* 146-2046 */
  159.         {0x5B, 0x52, 0xBA},        /* 147-2047 */
  160.         {0x06, 0xD2, 0x4E},        /* 148-2048 */
  161.         {0x0A, 0xDA, 0x42},        /* 149-2049 */
  162.         {0x35, 0x5B, 0x37},        /* 150-2050 */
  163.         {0x09, 0x37, 0x4B},        /* 151-2051 */
  164.         {0x84, 0x97, 0xC1},        /* 152-2052 */
  165.         {0x04, 0x97, 0x53},        /* 153-2053 */
  166.         {0x06, 0x4B, 0x48},        /* 154-2054 */
  167.         {0x66, 0xA5, 0x3C},        /* 155-2055 */
  168.         {0x0E, 0xA5, 0x4F},        /* 156-2056 */
  169.         {0x06, 0xAA, 0x44},        /* 157-2057 */
  170.         {0x4A, 0xB6, 0x38},        /* 158-2058 */
  171.         {0x0A, 0xAE, 0x4C},        /* 159-2059 */
  172.         {0x09, 0x2E, 0x42},        /* 160-2060 */
  173.         {0x3C, 0x97, 0x35},        /* 161-2061 */
  174.         {0x0C, 0x96, 0x49},        /* 162-2062 */
  175.         {0x7D, 0x4A, 0xBD},        /* 163-2063 */
  176.         {0x0D, 0x4A, 0x51},        /* 164-2064 */
  177.         {0x0D, 0xA5, 0x45},        /* 165-2065 */
  178.         {0x55, 0xAA, 0xBA},        /* 166-2066 */
  179.         {0x05, 0x6A, 0x4E},        /* 167-2067 */
  180.         {0x0A, 0x6D, 0x43},        /* 168-2068 */
  181.         {0x45, 0x2E, 0xB7},        /* 169-2069 */
  182.         {0x05, 0x2D, 0x4B},        /* 170-2070 */
  183.         {0x8A, 0x95, 0xBF},        /* 171-2071 */
  184.         {0x0A, 0x95, 0x53},        /* 172-2072 */
  185.         {0x0B, 0x4A, 0x47},        /* 173-2073 */
  186.         {0x6B, 0x55, 0x3B},        /* 174-2074 */
  187.         {0x0A, 0xD5, 0x4F},        /* 175-2075 */
  188.         {0x05, 0x5A, 0x45},        /* 176-2076 */
  189.         {0x4A, 0x5D, 0x38},        /* 177-2077 */
  190.         {0x0A, 0x5B, 0x4C},        /* 178-2078 */
  191.         {0x05, 0x2B, 0x42},        /* 179-2079 */
  192.         {0x3A, 0x93, 0xB6},        /* 180-2080 */
  193.         {0x06, 0x93, 0x49},        /* 181-2081 */
  194.         {0x77, 0x29, 0xBD},        /* 182-2082 */
  195.         {0x06, 0xAA, 0x51},        /* 183-2083 */
  196.         {0x0A, 0xD5, 0x46},        /* 184-2084 */
  197.         {0x54, 0xDA, 0xBA},        /* 185-2085 */
  198.         {0x04, 0xB6, 0x4E},        /* 186-2086 */
  199.         {0x0A, 0x57, 0x43},        /* 187-2087 */
  200.         {0x45, 0x27, 0x38},        /* 188-2088 */
  201.         {0x0D, 0x16, 0x4A},        /* 189-2089 */
  202.         {0x8E, 0x93, 0x3E},        /* 190-2090 */
  203.         {0x0D, 0x52, 0x52},        /* 191-2091 */
  204.         {0x0D, 0xAA, 0x47},        /* 192-2092 */
  205.         {0x66, 0xB5, 0x3B},        /* 193-2093 */
  206.         {0x05, 0x6D, 0x4F},        /* 194-2094 */
  207.         {0x04, 0xAE, 0x45},        /* 195-2095 */
  208.         {0x4A, 0x4E, 0xB9},        /* 196-2096 */
  209.         {0x0A, 0x2D, 0x4C},        /* 197-2097 */
  210.         {0x0D, 0x15, 0x41},        /* 198-2098 */
  211.         {0x2D, 0x92, 0xB5},        /* 199-2099 */
  212. };


  213. //公历前n月总天数
  214. unsigned int code Days_Code[13] =
  215. {
  216.         0,        //0
  217.         0,        //1,1月:当月
  218.         31,        //2,1月:31
  219.         59,        //3,1~2月:31+28=59
  220.         90,        //4,1~3月:31+28+31=90
  221.         120,        //5,1~4月:31+28+31+30=120
  222.         151,        //6,1~5月:31+28+31+30+31=151
  223.         181,        //7,1~6月:31+28+31+30+31+30=181
  224.         212,        //8,1~7月:31+28+31+30+31+30+31=212
  225.         243,        //9,1~8月:31+28+31+30+31+30+31+31=243
  226.         273,        //10,1~9月:31+28+31+30+31+30+31+31+30=273
  227.         304,        //11,1~10月:31+28+31+30+31+30+31+31+30+31=304
  228.         334,        //12,1~11月:31+28+31+30+31+30+31+31+30+31+30=334
  229. };


  230. //农历大小月特征位编码
  231. unsigned char code Month_Long_Short_Bit_Table[14] =
  232. {
  233.         0x00,                //0
  234.         BIT3,                //1,1月
  235.         BIT2,                //2,2月
  236.         BIT1,                //3,3月
  237.         BIT0,                //4,4月
  238.         BIT7,                //5,5月
  239.         BIT6,                //6,6月
  240.         BIT5,                //7,7月
  241.         BIT4,                //8,8月
  242.         BIT3,                //9,9月
  243.         BIT2,                //10,10月
  244.         BIT1,                //11,11月
  245.         BIT0,                //12,12月
  246.         BIT7,                //13,13月
  247. };
复制代码
  1. //******************************************************************
  2. //函数名称:unsigned char Get_Lunar_Month_Days(unsigned char Lunar_Month, unsigned int Offset)
  3. //函数功能:用于读取数据表中农历月的大月或小月
  4. //输入参数:Lunar_Month,Offset
  5. //返回值:  0/1(1:大月;0:小月)
  6. //******************************************************************
  7. unsigned char Get_Lunar_Month_Days(unsigned char Lunar_Month, unsigned int Offset)
  8. {
  9.         unsigned char        Month_Long_Short;        //大小月


  10.         Month_Long_Short = 0;        //无效数据返回小月

  11.         if(Lunar_Month <= Ubound(Month_Long_Short_Bit_Table))
  12.         {
  13.                 if(Lunar_Month <= 4)        //农历参数表格第0字节bit[3:0]表示农历第1-4月的大小
  14.                 {
  15.                         Month_Long_Short = (Lunar_Year_Code[Offset].Byte_0.Bits.Month_1_4_Long_Short & Month_Long_Short_Bit_Table[Lunar_Month]);
  16.                 }
  17.                 else if(Lunar_Month <= 12)        //农历参数表格第1字节bit[7:0]表示农历第5-12月的大小
  18.                 {
  19.                         Month_Long_Short = (Lunar_Year_Code[Offset].Month_5_12_Long_Short & Month_Long_Short_Bit_Table[Lunar_Month]);
  20.                 }
  21.                 else        //农历第13个月大小
  22.                 {
  23.                         Month_Long_Short = Lunar_Year_Code[Offset].Byte_2.Bits.Month_13_Long_Short;
  24.                 }
  25.         }

  26.         if(Month_Long_Short)
  27.         {
  28.                 Month_Long_Short = 1;
  29.         }

  30.         return Month_Long_Short;
  31. }
复制代码
  1. //******************************************************************
  2. //函数名称:Solar2Lunar_Typedef Get_China_Calendar(unsigned int Year,unsigned char Month,unsigned char Day)
  3. //函数功能:公农历转换
  4. //输入参数:Year:公历年(只允许1901-2099年)  Month:公历月  Day:公历日
  5. //返回值:  0/1 1对应转换成功,0对应转换失败
  6. //******************************************************************
  7. #define        C_SOLAR_YEAR_MIN        1901                        //公历年最小值
  8. #define        C_SOLAR_YEAR_MAX        2099                        //公历年最大值

  9. Solar2Lunar_Typedef Get_China_Calendar(unsigned int Year,unsigned char Month,unsigned char Day)
  10. {
  11.         unsigned char        Spring_Festival_Month;                //当年春节所在的公历月份
  12.         unsigned char        Spring_Festival_Date;                //当年春节所在的公历日
  13.         unsigned char        Leap_Month_Flag;                //闰月,农历月不+1
  14.         unsigned char        Lunar_Month;                        //农历月
  15.         unsigned char        Lunar_Month_Temp;                //农历月(尝试判断月份)
  16.         unsigned char        Lunar_Month_Save;                //农历月保存(用于判断是不是闰月)
  17.         unsigned char        Lunar_Date;                        //农历日
  18.         unsigned char        Lunar_Leap_Month;                //闰月
  19.         unsigned char        Lunar_Month_Days;                //农历月天数
  20.         unsigned char        Spring_Festival_Days;                //当年春年离当年元旦的天数
  21.         unsigned int        Days_After_New_Years_Day;        //公历日离当年元旦的天数
  22.         unsigned int        Days_Differ;                        //两个日期天数差
  23.         unsigned int        Table_Offset;                        //农历特征数据表格查表偏移量
  24.         Solar2Lunar_Typedef Return_Value;        //返回值


  25.         Return_Value.Month = 0;                //月
  26.         Return_Value.IS_Leap_Month = 0;        //闰月标志
  27.         Return_Value.Reserved_Bits = 0;
  28.         Return_Value.Date = 0;                //日

  29.         if((Year >= C_SOLAR_YEAR_MIN) && (Year <= C_SOLAR_YEAR_MAX))        //1901~2099年之外不处理
  30.         {
  31.                 Lunar_Month_Save=0;                //农历月保存(用于判断是不是闰月)
  32.         
  33.                 /* 定位数据表地址 */
  34.                 Table_Offset = (Year - 1900);        //农历特征数据从1900年开始,但只能转换1901年之后的数据,转换春节前的数据需要前一年的数据
  35.         
  36.                 /* 取当年春节所在的公历月份 */
  37.                 Spring_Festival_Month = Lunar_Year_Code[Table_Offset].Byte_2.Bits.Spring_Festival_Month;
  38.         
  39.                 /* 取当年春节所在的公历日 */
  40.                 Spring_Festival_Date = Lunar_Year_Code[Table_Offset].Byte_2.Bits.Spring_Festival_Date;
  41.         
  42.                 /* 计算当年春年离当年元旦的天数,春节只会在公历1月或2月 */
  43.                 if ( Spring_Festival_Month == 1 )
  44.                 {
  45.                         Spring_Festival_Days = Spring_Festival_Date - 1;
  46.                 }
  47.                 else
  48.                 {
  49.                         Spring_Festival_Days = Spring_Festival_Date + 31 - 1;
  50.                 }
  51.         
  52.                 /* 计算公历日离当年元旦的天数 */
  53.                 Days_After_New_Years_Day = Days_Code[Month] + Day - 1;
  54.         
  55.                 /* 如果公历月大于2月并且该年的2月为闰月,天数加1 */
  56.                 if (Month > 2)
  57.                 {
  58.                         if((Year % 100) == 0)        //能被100整除
  59.                         {
  60.                                 if((Year % 400) == 0)        //能被400整除--闰年
  61.                                 {
  62.                                         Days_After_New_Years_Day ++;
  63.                                 }
  64.                         }
  65.                         else if (Year % 4 == 0)        //不能被100整除,能被4整除--闰年
  66.                         {
  67.                                 Days_After_New_Years_Day ++;
  68.                         }
  69.                 }
  70.         
  71.                 /* 判断公历日在春节前还是春节后 */
  72.                 if(Days_After_New_Years_Day >= Spring_Festival_Days)        //当前公历日在春节后
  73.                 {
  74.                         Days_Differ = (Days_After_New_Years_Day - Spring_Festival_Days);        //Days_Differ存放当前公历日距离当前春节公历日天数
  75.                         
  76.                         Lunar_Month = 1;                //农历月
  77.                         Lunar_Month_Temp = 1;                //农历月,从1月开始判断(第一个月不会是闰月,直接农历正月天数)
  78.                         Leap_Month_Flag = 0;                //闰月,农历月不+1
  79.         
  80.                         if(Get_Lunar_Month_Days(Lunar_Month_Temp, Table_Offset) == 0)        //农历月天数
  81.                         {
  82.                                 Lunar_Month_Days = 29;        /* 小月29天 */
  83.                         }
  84.                         else
  85.                         {
  86.                                 Lunar_Month_Days = 30;        /* 大月30天 */
  87.                         }
  88.         
  89.                         /* 从数据表中取该年的闰月月份,如为0则该年无闰月 */
  90.                         Lunar_Leap_Month = Lunar_Year_Code[Table_Offset].Byte_0.Bits.Leap_Month;
  91.         
  92.                         while(Days_Differ >= Lunar_Month_Days)        //天数差>=当前处理农历月天数
  93.                         {
  94.                                 Days_Differ -= Lunar_Month_Days;
  95.                                 
  96.                                 if(Lunar_Month == Lunar_Leap_Month)        //农历月=当年农历闰月
  97.                                 {
  98.                                         Leap_Month_Flag = (~Leap_Month_Flag);        //闰月标志
  99.                                        
  100.                                         if (Leap_Month_Flag == 0)
  101.                                         {
  102.                                                 Lunar_Month ++;        //闰月之后的下一个月
  103.                                         }
  104.                                         else
  105.                                         {
  106.                                                 Lunar_Month_Save = Lunar_Month;        //农历月保存(用于判断是不是闰月)
  107.                                         }
  108.                                 }
  109.                                 else
  110.                                 {
  111.                                         Lunar_Month ++;                //下一个月
  112.                                 }
  113.                                 
  114.                                 Lunar_Month_Temp ++;
  115.         
  116.                                 if(Get_Lunar_Month_Days(Lunar_Month_Temp, Table_Offset) == 0)
  117.                                 {
  118.                                         Lunar_Month_Days = 29;
  119.                                 }
  120.                                 else
  121.                                 {
  122.                                         Lunar_Month_Days = 30;
  123.                                 }
  124.                         }
  125.         
  126.                         Lunar_Date = (Days_Differ + 1);                //农历日
  127.                 }
  128.                 else        /* 公历日在春节前使用下面代码进行运算 */
  129.                 {
  130.                         Days_Differ = (Spring_Festival_Days - Days_After_New_Years_Day);
  131.                         
  132.                         Table_Offset -= 1;        //未到当年春节,取前一年的农历特征表格
  133.                         Lunar_Month = 12;        //从前一年农历十二月开始判断
  134.                         
  135.                         Lunar_Leap_Month = Lunar_Year_Code[Table_Offset].Byte_0.Bits.Leap_Month;        //闰月月份
  136.                         
  137.                         if (Lunar_Leap_Month == 0)        //当前年没有闰月
  138.                         {
  139.                                 Lunar_Month_Temp = 12;        //农历月,从12月开始判断
  140.                         }
  141.                         else
  142.                         {
  143.                                 Lunar_Month_Temp = 13;        //农历月,当前年有闰月,从13月开始判断
  144.                         }
  145.         
  146.                         Leap_Month_Flag = 0;        //闰月,农历月不-1
  147.         
  148.                         if(Get_Lunar_Month_Days(Lunar_Month_Temp, Table_Offset) == 0)        //农历月天数
  149.                         {
  150.                                 Lunar_Month_Days = 29;        /* 小月29天 */
  151.                         }
  152.                         else
  153.                         {
  154.                                 Lunar_Month_Days = 30;        /* 大月30天 */
  155.                         }
  156.         
  157.                         while(Days_Differ > Lunar_Month_Days)
  158.                         {
  159.                                 Days_Differ -= Lunar_Month_Days;
  160.                                 
  161.                                 Lunar_Month_Temp --;
  162.                                 
  163.                                 if(Leap_Month_Flag == 0)
  164.                                 {
  165.                                         Lunar_Month --;
  166.                                 }
  167.                                 
  168.                                 if(Lunar_Month == Lunar_Leap_Month)
  169.                                 {
  170.                                         Leap_Month_Flag = (~Leap_Month_Flag);
  171.                                        
  172.                                         if(Leap_Month_Flag)
  173.                                         {
  174.                                                 Lunar_Month_Save = Lunar_Month;        //农历月保存(用于判断是不是闰月)
  175.                                         }
  176.                                 }
  177.                                 
  178.                                 if(Get_Lunar_Month_Days(Lunar_Month_Temp, Table_Offset) == 0)
  179.                                 {
  180.                                         Lunar_Month_Days = 29;
  181.                                 }
  182.                                 else
  183.                                 {
  184.                                         Lunar_Month_Days = 30;
  185.                                 }
  186.                         }
  187.         
  188.                         Lunar_Date = (Lunar_Month_Days - Days_Differ + 1);        //农历日
  189.                 }
  190.         
  191.                 if(Lunar_Month == Lunar_Month_Save)        //当前月=闰月保存月份
  192.                 {
  193.                         Return_Value.IS_Leap_Month = 1;        //闰月标志=1
  194.                 }
  195.                
  196.                 Return_Value.Month = Lunar_Month;        //保存转换农历月、日
  197.                 Return_Value.Date = Lunar_Date;
  198.         }

  199.         return        Return_Value;        //返回值
  200. }
复制代码

转换实例:
(1)定义一个结构体变量保存转换返回值
  1. Solar2Lunar_Typedef Lunar_Data;        //公历转农历返回值
复制代码
(2)简单判断数据是否有效(待转换日期在预设范围内都会返回有效结果)。
  1.         Lunar_Data=Get_China_Calendar(Year,Month,Date);        //公历转农历
  2.         
  3.         if(Lunar_Data.Month != 0)        //数据有效
  4.         {
  5.                 Lunar_Calendar.Month = Lunar_Data.Month;        //保存转换农历月、日
  6.                 Lunar_Calendar.Date= Lunar_Data.Date;
  7.                
  8.                 Lunar_Calendar.IS_Leap_Month = Lunar_Data.IS_Leap_Month;        //闰月标志
  9.         }
复制代码



打赏

参与人数 3家元 +90 收起 理由
hefanghua + 30 这是最详尽的了!果断收藏。
水表君 + 30 優秀文章
兔包公 + 30 以資鼓勵

查看全部打赏

发表于 2024-10-22 15:31:36 | 显示全部楼层
谢谢楼主分享 学习一下
回复 支持 反对

使用道具 举报

发表于 2024-10-22 15:45:13 | 显示全部楼层
感谢分享,学习一下,看看我之前的时钟程序用的也是错误数据
回复 支持 反对

使用道具 举报

发表于 2024-10-22 16:21:00 | 显示全部楼层
太佩服了,学习一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-22 18:13:53 | 显示全部楼层
ljlj2001 发表于 2024-10-22 15:45
感谢分享,学习一下,看看我之前的时钟程序用的也是错误数据

我看了几个开源的万年历程序都使用了错误的数据,今年之前的数据错误影响不大,之后的影响就比较大,比如明年(2025年),原来数据是三月小四月大,公历2025-4-27转换出来是农历四月初一,正确的应该是农历三月三十。
回复 支持 反对

使用道具 举报

发表于 2024-10-23 17:27:57 | 显示全部楼层
感谢分享,农历是历史的传承,有公历时间的都应该把农历加进去。留个爪印,以后过来抄。
回复 支持 反对

使用道具 举报

发表于 2024-10-23 21:50:56 来自手机浏览器 | 显示全部楼层
马克一下,虽然不太常用,24节气好像是按农历来的吧?有时候还挺准的
回复 支持 反对

使用道具 举报

发表于 2024-10-24 10:37:39 | 显示全部楼层
感谢分享,收藏了
回复 支持 反对

使用道具 举报

发表于 2024-10-24 12:09:15 | 显示全部楼层
mmxx2015 发表于 2024-10-22 18:13
我看了几个开源的万年历程序都使用了错误的数据,今年之前的数据错误影响不大,之后的影响就比较大,比如 ...

学习了,能力有限,程序我也就只会般来用用,至于对错就没有能力分析了
回复 支持 反对

使用道具 举报

发表于 2024-10-25 13:55:18 | 显示全部楼层
谢谢分享!楼主好人!
回复 支持 反对

使用道具 举报

发表于 2024-10-25 22:13:20 | 显示全部楼层
兔包公 发表于 2024-10-23 21:50
马克一下,虽然不太常用,24节气好像是按农历来的吧?有时候还挺准的

24节气基本上是按公历来的,是为了掌握农时的,跟太阳的位置相关的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-25 22:58:05 | 显示全部楼层
qqtools 发表于 2024-10-25 22:13
24节气基本上是按公历来的,是为了掌握农时的,跟太阳的位置相关的。

说以阳历(太阳历)为准更准确。现行公历是阳历的一种。

二十四节气是阴历还是阳历?
①阳历:以四季变化周期即回归年为主要依据;②阴历:以月相阴晴圆缺变化周期即朔望月为主要依据;③阴阳历:兼顾回归年和朔望月编制;④二十四节气反映的是地球绕太阳运行轨道上的不同位置,属于阴阳历中的阳历部分。


二十四节气起源于黄河流域。远在春秋时代,就定出仲春、仲夏、仲秋和仲冬等四个节气。以后不断地改进与完善,到秦汉年间,二十四节气已完全确立。公元前104年,由邓平等制定的《太初历》,正式把二十四节气订于历法,明确了二十四节气的天文位置。

太阳从黄经零度起,沿黄经每运行15度所经历的时日称为“一个节气”。每年运行360度,共经历24个节气,每月2个。其中,每月第一个节气为“节气”,即:立春、惊蛰、清明、立夏、芒种、小暑、立秋、白露、寒露、立冬、大雪和小寒等12个节气;每月的第二个节气为“中气”,即:雨水、春分、谷雨、小满、夏至、大暑、处暑、秋分、霜降、小雪、冬至和大寒等12个节气。“节气” 和“中气”交替出现,各历时15天,现在人们已经把“节气”和“中气”统称为“节气”。

二十四节气反映了太阳的周年视运动,所以节气在现行的公历中日期基本固定,上半年在6日、21日,下半年在8日、23日,前后不差1~2天。


格里历(英文:Gregorian calendar)……即现行的公历,亦有译为额我略历、格列高利历,是由意大利医生兼哲学家里利乌斯(Aloysius Lilius)改革儒略历制定的历法,由教皇格列高利十三世在1582年颁行。格里历是阳历的一种,于1912年开始在中国正式采用,取代传统使用的中国历法夏历(农历)。

回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-29 01:33:17 | 显示全部楼层
本帖最后由 mmxx2015 于 2024-11-2 15:25 编辑

补充公历日期二十四节气、天干地支编年、农历生肖转换。

原数据及程序修改自:
公农历转换和获取二十四节气算法
https://blog.csdn.net/qq_46041930/article/details/108653836

原文二十四节气参数表部分错误,已根据日梭万年历 v5.0修正(说明:农历的日期,以《中国天文年历》为准,但不提前发布,无法用于制作万年历;日梭万年历数据是接近《中国天文年历》的准权威数据)。

修正的二十四节气参数:
  1. 1、1904年:
  2. 公历月份  1月   2月   3月   4月   5月   6月   7月   8月   9月   10月  11月  12月
  3. 错误数据:0x86, 0xA5, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x78,        //1904
  4. 正确数据:0x86, 0xA5, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87,        //1904

  5. 大雪-12.7:15-7=8
  6. 冬至-12.22:22-15=7

  7. 2、1910年:
  8. 公历月份  1月   2月   3月   4月   5月   6月   7月   8月   9月   10月  11月  12月
  9. 错误数据:0x96, 0xA4, 0x96, 0x96, 0x97, 0x97, 0x79, 0x79, 0x79, 0x79, 0x78, 0x78,        //1910
  10. 正确数据:0x96, 0xA4, 0x96, 0x96, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78,        //1910

  11. 寒露-10.9:15-9=6

  12. 3、1922年:
  13. 公历月份  1月   2月   3月   4月   5月   6月   7月   8月   9月   10月  11月  12月
  14. 错误数据:0x96, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x87,        //1922
  15. 正确数据:0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x77,        //1922

  16. 谷雨-4.21:21-15=6
  17. 小满-5.22:22-15=7
  18. 大暑-7.24:24-15=9
  19. 秋分-9.24:24-15=9
  20. 大雪-12.8:15-8=7

  21. 4、1935年:
  22. 公历月份  1月   2月   3月   4月   5月   6月   7月   8月   9月   10月  11月  12月
  23. 错误数据:0x96, 0xA4, 0x96, 0x96, 0x97, 0x97, 0x79, 0x79, 0x79, 0x79, 0x78, 0x78,        //1935
  24. 正确数据:0x96, 0xA4, 0x96, 0x96, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78,        //1935

  25. 寒露-10.9:15-9=6

  26. 5、1964年:
  27. 公历月份  1月   2月   3月   4月   5月   6月   7月   8月   9月   10月  11月  12月
  28. 错误数据:0x96, 0xB4, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87,        //1964
  29. 正确数据:0x96, 0xA4, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87,        //1964

  30. 立春-2.5:15-5=10

  31. 6、1968年:
  32. 公历月份  1月   2月   3月   4月   5月   6月   7月   8月   9月   10月  11月  12月
  33. 错误数据:0x96, 0xB4, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87,        //1968
  34. 正确数据:0x96, 0xA4, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87,        //1968

  35. 立春-2.5:15-5=10

  36. 7、1972年:
  37. 公历月份  1月   2月   3月   4月   5月   6月   7月   8月   9月   10月  11月  12月
  38. 错误数据:0x96, 0xA4, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87,        //1972
  39. 正确数据:0x96, 0xA4, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87,        //1972

  40. 芒种-6.5:15-5=10

  41. 8、2002年:
  42. 公历月份  1月   2月   3月   4月   5月   6月   7月   8月   9月   10月  11月  12月
  43. 错误数据:0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87,        //2002
  44. 正确数据:0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87,        //2002

  45. 立秋-8.8:15-8=7

  46. 9、2022年:
  47. 公历月份  1月   2月   3月   4月   5月   6月   7月   8月   9月   10月  11月  12月
  48. 错误数据:0xA5, 0xB4, 0xA5, 0xB5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87,        //2022
  49. 正确数据:0xA5, 0xB4, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87,        //2022

  50. 清明-4.5:15-5=10

  51. 10、2052年:
  52. 公历月份  1月   2月   3月   4月   5月   6月   7月   8月   9月   10月  11月  12月
  53. 错误数据:0xA5, 0xB4, 0xA5, 0xB4, 0xA5, 0xA5, 0x97, 0x87, 0x97, 0x88, 0x86, 0x96,        //2052
  54. 正确数据:0xA5, 0xB4, 0xA5, 0xB4, 0xA5, 0xA5, 0x97, 0x87, 0x87, 0x88, 0x86, 0x96,        //2052

  55. 白露-9.7:15-7=8
复制代码
二十四节气转换每年需要12字节表格表示(每个公历月2个节气,占用一个字节,高低4位各表示一个节气),转换程序转换结果为0~23之间的值为有效值,0表示公历年1月第一个节气小寒,23表示公历年12月最后一个节气冬至。

常数:

  1. #define        C_SOLAR_YEAR_MIN        1901                        //公历年最小值
  2. #define        C_SOLAR_YEAR_MAX        2099                        //公历年最大值

  3. #define        C_SEXAGENARY_YEAR        1864                        //一个甲子年的公历年份(为简化处理,需小于最小处理年份)
复制代码

二十四节气对应公历日期表格:
  1. //******************************************************************
  2. // 二十四节气对应年的日期表
  3. // 依次从1月开始,每月用一个字节存放,用15减去高四位数据即得到第一个节气对应日期
  4. // 低四位数据加上15即得到第二个节气对应日期
  5. //******************************************************************
  6. unsigned char code Solar_Terms_Code[199][12] =
  7. {
  8.         {0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77},        //1901
  9.         {0x96, 0xA4, 0x96, 0x96, 0x97, 0x87, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78},        //1902
  10.         {0x96, 0xA5, 0x87, 0x96, 0x87, 0x87, 0x79, 0x69, 0x69, 0x69, 0x78, 0x78},        //1903
  11.         {0x86, 0xA5, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87},        //1904
  12.         {0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77},        //1905
  13.         {0x96, 0xA4, 0x96, 0x96, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78},        //1906
  14.         {0x96, 0xA5, 0x87, 0x96, 0x87, 0x87, 0x79, 0x69, 0x69, 0x69, 0x78, 0x78},        //1907
  15.         {0x86, 0xA5, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87},        //1908
  16.         {0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77},        //1909
  17.         {0x96, 0xA4, 0x96, 0x96, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78},        //1910
  18.         {0x96, 0xA5, 0x87, 0x96, 0x87, 0x87, 0x79, 0x69, 0x69, 0x69, 0x78, 0x78},        //1911
  19.         {0x86, 0xA5, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x77, 0x87},        //1912
  20.         {0x95, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x77},        //1913
  21.         {0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78},        //1914
  22.         {0x96, 0xA5, 0x97, 0x96, 0x97, 0x87, 0x79, 0x79, 0x69, 0x69, 0x78, 0x78},        //1915
  23.         {0x96, 0xA5, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87},        //1916
  24.         {0x95, 0xB4, 0x96, 0xA6, 0x96, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x77},        //1917
  25.         {0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x77},        //1918
  26.         {0x96, 0xA5, 0x97, 0x96, 0x97, 0x87, 0x79, 0x79, 0x69, 0x69, 0x78, 0x78},        //1919
  27.         {0x96, 0xA5, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87},        //1920
  28.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x87},        //1921
  29.         {0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x77},        //1922
  30.         {0x96, 0xA4, 0x96, 0x96, 0x97, 0x87, 0x79, 0x79, 0x69, 0x69, 0x78, 0x78},        //1923
  31.         {0x96, 0xA5, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87},        //1924
  32.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x87},        //1925
  33.         {0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77},        //1926
  34.         {0x96, 0xA4, 0x96, 0x96, 0x97, 0x87, 0x79, 0x79, 0x69, 0x69, 0x78, 0x78},        //1927
  35.         {0x96, 0xA5, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87},        //1928
  36.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87},        //1929
  37.         {0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77},        //1930
  38.         {0x96, 0xA4, 0x96, 0x96, 0x97, 0x87, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78},        //1931
  39.         {0x96, 0xA5, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87},        //1932
  40.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87},        //1933
  41.         {0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77},        //1934
  42.         {0x96, 0xA4, 0x96, 0x96, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78},        //1935
  43.         {0x96, 0xA5, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87},        //1936
  44.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87},        //1937
  45.         {0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77},        //1938
  46.         {0x96, 0xA4, 0x96, 0x96, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78},        //1939
  47.         {0x96, 0xA5, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87},        //1940
  48.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87},        //1941
  49.         {0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77},        //1942
  50.         {0x96, 0xA4, 0x96, 0x96, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78},        //1943
  51.         {0x96, 0xA5, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87},        //1944
  52.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87},        //1945
  53.         {0x95, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x77},        //1946
  54.         {0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78},        //1947
  55.         {0x96, 0xA5, 0xA6, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87},        //1948
  56.         {0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87},        //1949
  57.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x77},        //1950
  58.         {0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78},        //1951
  59.         {0x96, 0xA5, 0xA6, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87},        //1952
  60.         {0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87},        //1953
  61.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x87},        //1954
  62.         {0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77},        //1955
  63.         {0x96, 0xA5, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87},        //1956
  64.         {0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87},        //1957
  65.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87},        //1958
  66.         {0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77},        //1959
  67.         {0x96, 0xA4, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //1960
  68.         {0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87},        //1961
  69.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87},        //1962
  70.         {0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77},        //1963
  71.         {0x96, 0xA4, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //1964
  72.         {0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87},        //1965
  73.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87},        //1966
  74.         {0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77},        //1967
  75.         {0x96, 0xA4, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //1968
  76.         {0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87},        //1969
  77.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87},        //1970
  78.         {0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77},        //1971
  79.         {0x96, 0xA4, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //1972
  80.         {0xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87},        //1973
  81.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87},        //1974
  82.         {0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x77},        //1975
  83.         {0x96, 0xA4, 0xA5, 0xB5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //1976
  84.         {0xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87},        //1977
  85.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x78, 0x87},        //1978
  86.         {0x95, 0xB4, 0x96, 0xA6, 0x96, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x77},        //1979
  87.         {0x96, 0xA4, 0xA5, 0xB5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //1980
  88.         {0xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87},        //1981
  89.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87},        //1982
  90.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x77},        //1983
  91.         {0x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x87},        //1984
  92.         {0xA5, 0xB4, 0xA6, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87},        //1985
  93.         {0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87},        //1986
  94.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x79, 0x78, 0x69, 0x78, 0x87},        //1987
  95.         {0x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86},        //1988
  96.         {0xA5, 0xB4, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //1989
  97.         {0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87},        //1990
  98.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87},        //1991
  99.         {0x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86},        //1992
  100.         {0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //1993
  101.         {0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87},        //1994
  102.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87},        //1995
  103.         {0x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86},        //1996
  104.         {0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //1997
  105.         {0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87},        //1998
  106.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87},        //1999
  107.         {0x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86},        //2000
  108.         {0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //2001
  109.         {0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87},        //2002
  110.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87},        //2003
  111.         {0x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86},        //2004
  112.         {0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //2005
  113.         {0xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87},        //2006
  114.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87},        //2007
  115.         {0x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x87, 0x78, 0x87, 0x86},        //2008
  116.         {0xA5, 0xB3, 0xA5, 0xB5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //2009
  117.         {0xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87},        //2010
  118.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x78, 0x87},        //2011
  119.         {0x96, 0xB4, 0xA5, 0xB5, 0xA5, 0xA6, 0x87, 0x88, 0x87, 0x78, 0x87, 0x86},        //2012
  120.         {0xA5, 0xB3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x87},        //2013
  121.         {0xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87},        //2014
  122.         {0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87},        //2015
  123.         {0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x87, 0x88, 0x87, 0x78, 0x87, 0x86},        //2016
  124.         {0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x87},        //2017
  125.         {0xA5, 0xB4, 0xA6, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87},        //2018
  126.         {0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87},        //2019
  127.         {0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x86},        //2020
  128.         {0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86},        //2021
  129.         {0xA5, 0xB4, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //2022
  130.         {0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87},        //2023
  131.         {0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96},        //2024
  132.         {0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86},        //2025
  133.         {0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //2026
  134.         {0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87},        //2027
  135.         {0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96},        //2028
  136.         {0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86},        //2029
  137.         {0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //2030
  138.         {0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87},        //2031
  139.         {0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96},        //2032
  140.         {0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86},        //2033
  141.         {0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //2034
  142.         {0xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87},        //2035
  143.         {0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96},        //2036
  144.         {0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86},        //2037
  145.         {0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //2038
  146.         {0xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87},        //2039
  147.         {0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96},        //2040
  148.         {0xA5, 0xC3, 0xA5, 0xB5, 0xA5, 0xA6, 0x87, 0x88, 0x87, 0x78, 0x87, 0x86},        //2041
  149.         {0xA5, 0xB3, 0xA5, 0xB5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //2042
  150.         {0xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87},        //2043
  151.         {0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x88, 0x87, 0x96},        //2044
  152.         {0xA5, 0xC3, 0xA5, 0xB4, 0xA5, 0xA6, 0x87, 0x88, 0x87, 0x78, 0x87, 0x86},        //2045
  153.         {0xA5, 0xB3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x87},        //2046
  154.         {0xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87},        //2047
  155.         {0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA5, 0x97, 0x87, 0x87, 0x88, 0x86, 0x96},        //2048
  156.         {0xA4, 0xC3, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x86},        //2049
  157.         {0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x87},        //2050
  158.         {0xA5, 0xB4, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //2051
  159.         {0xA5, 0xB4, 0xA5, 0xB4, 0xA5, 0xA5, 0x97, 0x87, 0x87, 0x88, 0x86, 0x96},        //2052
  160.         {0xA4, 0xC3, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x86},        //2053
  161.         {0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x87},        //2054
  162.         {0xA5, 0xB4, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //2055
  163.         {0xA5, 0xB4, 0xA5, 0xB4, 0xA5, 0xA5, 0x97, 0x87, 0x87, 0x88, 0x86, 0x96},        //2056
  164.         {0xA4, 0xC3, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96},        //2057
  165.         {0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86},        //2058
  166.         {0xA5, 0xB4, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //2059
  167.         {0xA5, 0xB4, 0xA5, 0xB4, 0xA5, 0xA5, 0x97, 0x87, 0x87, 0x87, 0x96, 0x96},        //2060
  168.         {0xA4, 0xC3, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96},        //2061
  169.         {0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86},        //2062
  170.         {0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //2063
  171.         {0xA5, 0xB4, 0xA5, 0xB4, 0xA5, 0xA5, 0x97, 0x87, 0x87, 0x87, 0x96, 0x96},        //2064
  172.         {0xA4, 0xC3, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96},        //2065
  173.         {0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86},        //2066
  174.         {0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //2067
  175.         {0xA5, 0xB4, 0xA5, 0xB4, 0xB5, 0xA5, 0x97, 0x97, 0x87, 0x87, 0x96, 0x96},        //2068
  176.         {0xA4, 0xC3, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96},        //2069
  177.         {0xA5, 0xC3, 0xA5, 0xB5, 0xA5, 0xA6, 0x87, 0x88, 0x87, 0x78, 0x87, 0x86},        //2070
  178.         {0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87},        //2071
  179.         {0xA5, 0xB4, 0xA5, 0xB4, 0xB5, 0xA5, 0x97, 0x97, 0x87, 0x87, 0x96, 0x96},        //2072
  180.         {0xA4, 0xC3, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x88, 0x87, 0x96},        //2073
  181.         {0xA5, 0xC3, 0xA5, 0xB5, 0xA5, 0xA6, 0x87, 0x88, 0x87, 0x78, 0x87, 0x86},        //2074
  182.         {0xA5, 0xB3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x87},        //2075
  183.         {0xA5, 0xB4, 0xA5, 0xB4, 0xB5, 0xA5, 0x97, 0x97, 0x87, 0x87, 0x96, 0x96},        //2076
  184.         {0xA4, 0xC3, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x88, 0x87, 0x96},        //2077
  185.         {0xA5, 0xC3, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x88, 0x87, 0x78, 0x87, 0x86},        //2078
  186.         {0xA5, 0xB3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x87},        //2079
  187.         {0xA5, 0xB4, 0xA5, 0xB4, 0xB5, 0xA5, 0x97, 0x97, 0x87, 0x87, 0x96, 0x96},        //2080
  188.         {0xA4, 0xC3, 0xA5, 0xB4, 0xA5, 0xA5, 0x97, 0x87, 0x87, 0x88, 0x86, 0x96},        //2081
  189.         {0xA5, 0xC3, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x86},        //2082
  190.         {0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x87},        //2083
  191.         {0xA5, 0xB4, 0xB4, 0xB4, 0xB5, 0xA5, 0x97, 0x97, 0x97, 0x87, 0x96, 0x96},        //2084
  192.         {0xB4, 0xC3, 0xA5, 0xB4, 0xA5, 0xA5, 0x97, 0x87, 0x87, 0x88, 0x86, 0x96},        //2085
  193.         {0xA4, 0xC3, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x86},        //2086
  194.         {0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x87},        //2087
  195.         {0xA5, 0xB4, 0xB4, 0xB4, 0xB5, 0xB5, 0x97, 0x97, 0x97, 0x87, 0x96, 0x96},        //2088
  196.         {0xB4, 0xC3, 0xA5, 0xB4, 0xA5, 0xA5, 0x97, 0x87, 0x87, 0x88, 0x86, 0x96},        //2089
  197.         {0xA4, 0xC3, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96},        //2090
  198.         {0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86},        //2091
  199.         {0xA5, 0xB4, 0xB4, 0xB4, 0xB5, 0xB5, 0x97, 0x97, 0x97, 0x87, 0x96, 0x96},        //2092
  200.         {0xB4, 0xC3, 0xA5, 0xB4, 0xA5, 0xA5, 0x97, 0x87, 0x87, 0x87, 0x96, 0x96},        //2093
  201.         {0xA4, 0xC3, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96},        //2094
  202.         {0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86},        //2095
  203.         {0xA5, 0xB3, 0xB4, 0xB4, 0xB5, 0xB5, 0x97, 0x97, 0x97, 0x87, 0x96, 0x96},        //2096
  204.         {0xB4, 0xC3, 0xA5, 0xB4, 0xA5, 0xA5, 0x97, 0x97, 0x87, 0x87, 0x96, 0x96},        //2097
  205.         {0xA4, 0xC3, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96},        //2098
  206.         {0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86},        //2099
  207. };
复制代码


查询转换程序:

  1. //******************************************************************
  2. //函数名称:unsigned char Get_24_Solar_Terms(unsigned short int Year,unsigned char Month,unsigned char Day)
  3. //函数功能:查询当天是不是二十四节气之一
  4. //输入参数:Year:公历年(只允许1901-2099年)  Month:公历月  Day:公历日
  5. //返回值:  0xff:不是;0~23:24节气编号(0-小寒,1-大寒,2-春分 …… 23冬至)
  6. //******************************************************************
  7. unsigned char Get_24_Solar_Terms(unsigned short int Year,unsigned char Month,unsigned char Day)
  8. {
  9.         unsigned char        Solar_Terms_Data;
  10.         unsigned char        Solar_Terms_Day;
  11.         unsigned char        Return_Value;                //返回值
  12.         
  13.         
  14.         Return_Value = 0xff;        //默认返回无效值
  15.         
  16.         if((Year >= C_SOLAR_YEAR_MIN) && (Year <= C_SOLAR_YEAR_MAX))        //公历年范围
  17.         {        
  18.                 Solar_Terms_Data = Solar_Terms_Code[(Year - C_SOLAR_YEAR_MIN)][(Month - 1)];        //当月24节气的公历日期编码
  19.                
  20.                 if(Day < 15)        //高4位,当月第一个节气
  21.                 {
  22.                         Solar_Terms_Day = (15 - (Solar_Terms_Data >> 4));
  23.                         if(Day == Solar_Terms_Day)
  24.                         {
  25.                                 Return_Value = ((Month - 1) * 2);
  26.                         }
  27.                 }
  28.                 else        //低4位,当月第二个节气
  29.                 {
  30.                         Solar_Terms_Day = (15 + (Solar_Terms_Data & 0x0f));
  31.                         if(Day == Solar_Terms_Day)
  32.                         {
  33.                                 Return_Value = (((Month - 1) * 2) + 1);
  34.                         }
  35.                 }
  36.         }
  37.         
  38.         return        Return_Value;        //返回值
  39. }
复制代码

查询转换实例:
  1. unsigned char Solar_Terms;        //节气

  2.         Solar_Terms=Get_24_Solar_Terms(2025,7,22);        //当天是不是二十四节气之一
  3.         if(Solar_Terms <= 23)        //数据有效
  4.         {
  5.                 ……        //Solar_Terms = 13,大暑
  6.         }
复制代码

天干地支编年转换:根据百度知道回复编写程序
https://zhidao.baidu.com/question/1888724680366747548.html

(1)找一个甲子年作为起始点,比如1864(1864<1901,计算差值时不需要处理负数,又能满足(2099-1864)<255,差值用一个字节保存)
(2)把干支分成两个数组,天干十,地支十二
(3)输入年份,减去起始,即减1864。如果当天在当年正月初一之前,差值-1(算上一农历年)。
(4)除以60得到余数k
(5)用k除以10,得到的余数为天干序数
(6)用k除以12,得到的余数为地支序数
(7)组合天干地支输出

  1. //******************************************************************
  2. //函数名称:unsigned char Get_Heavenly_Stems_Earthly_Branches(unsigned int Year,unsigned char Month,unsigned char Date)
  3. //函数功能:查询当年天干地支序数
  4. //输入参数:Year:公历年(需≥1864年 && ≤(1864+255)年),月,日
  5. //返回值:bit[7:4]天干序数+bit[3:0]地支序数(其中0xFF表示无效值)
  6. //******************************************************************
  7. unsigned char Get_Heavenly_Stems_Earthly_Branches(unsigned int Year,unsigned char Month,unsigned char Date)
  8. {
  9.     unsigned int    Table_Offset;            //农历特征数据表格查表偏移量
  10.     unsigned char    Spring_Festival_Month;        //当年春节所在的公历月份
  11.     unsigned char    Spring_Festival_Date;        //当年春节所在的公历日
  12.     unsigned char    Year_Differ;            //输入年份与指定甲子年年份差
  13.     unsigned char    Year_Remainder;            //(Year_Differ % 60)
  14.     unsigned char    Return_Value;            //返回值:天干序数+地支序数
  15.    
  16.    
  17.     Return_Value = 0xff;    //默认返回无效值
  18.    
  19.     if((Year >= C_SEXAGENARY_YEAR) && (Year <= (C_SEXAGENARY_YEAR + 255)))    //公历年范围
  20.     {
  21.         /* 定位数据表地址 */
  22.         Table_Offset = (Year - 1900);    //农历特征数据从1900年开始
  23.    
  24.         /* 取当年春节所在的公历月份 */
  25.         Spring_Festival_Month = Lunar_Year_Code[Table_Offset].Byte_2.Bits.Spring_Festival_Month;
  26.    
  27.         /* 取当年春节所在的公历日 */
  28.         Spring_Festival_Date = Lunar_Year_Code[Table_Offset].Byte_2.Bits.Spring_Festival_Date;
  29.    
  30.         Year_Differ = (Year - C_SEXAGENARY_YEAR);    //输入年份与指定甲子年年份差
  31.         
  32.         if(Month < Spring_Festival_Month)    //未到当前公历年正月,年份差 - 1
  33.         {
  34.             Year_Differ --;
  35.         }
  36.         else if(Month == Spring_Festival_Month)    //已到当年公历年春节月份,再比较当天日期是否在正月初一之前
  37.         {
  38.             if(Date < Spring_Festival_Date)    //未到当前公历年正月,年份差 - 1
  39.             {
  40.                 Year_Differ --;
  41.             }
  42.         }
  43.         
  44.         Year_Remainder = (Year_Differ % 60);        //60年一个周期
  45.         
  46.         Return_Value = ((Year_Remainder % 10) << 4);    //天干序数
  47.         Return_Value |= (Year_Remainder % 12);        //地支序数
  48.     }
  49.    
  50.     return    Return_Value;    //返回值
  51. }
复制代码

转换实例:
  1. unsigned char Lunar_Calendar_Year;

  2.         Lunar_Calendar_Year=Get_Heavenly_Stems_Earthly_Branches(2025,7,25);
  3.         
  4.         if(Lunar_Calendar_Year != 0xff)        //数据有效
  5.         {
  6.                 ……        //返回值=0x15,1--天干乙,5--地支巳,生肖蛇,合成信息:乙巳蛇年
  7.         }
复制代码





补充内容 (2025-1-29 17:44):
干支年转换程序有问题,应改为以立春日为界,修正程序见27楼。
回复 支持 反对

使用道具 举报

发表于 2024-10-29 22:26:54 | 显示全部楼层
感谢楼主分享,留个记号,后面用到的时候来研究
回复 支持 反对

使用道具 举报

发表于 2024-10-30 15:57:37 | 显示全部楼层
谢谢分享,虽然不会单片机
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-1 21:31:01 | 显示全部楼层
本帖最后由 mmxx2015 于 2024-11-2 15:26 编辑

补充查表转换星期日程序,思路仍来自:
公农历转换和获取二十四节气算法
https://blog.csdn.net/qq_46041930/article/details/108653836


文中的程序似乎不完整而且距1901.1.1的天数用16为变量保存会溢出。

实现方法改为:

(1)用100字节表格表示1901 ~ 2100年每年元旦对应的星期日。一字节高低4为各可以表示一年。
  1. //1901~2100年元旦日对应星期日
  2. //从1901年开始,一字节高4位对应奇数年元旦日星期日,低4位对应次年年元旦日星期日(1~7对应星期一到星期日)
  3. unsigned char code New_Years_Day_Weekday_Table[100] =
  4. {
  5.         0x23,        //0  - 1901-01-01,1902-01-01
  6.         0x45,        //1  - 1903-01-01,1904-01-01
  7.         0x71,        //2  - 1905-01-01,1906-01-01
  8.         0x23,        //3  - 1907-01-01,1908-01-01
  9.         0x56,        //4  - 1909-01-01,1910-01-01
  10.         0x71,        //5  - 1911-01-01,1912-01-01
  11.         0x34,        //6  - 1913-01-01,1914-01-01
  12.         0x56,        //7  - 1915-01-01,1916-01-01
  13.         0x12,        //8  - 1917-01-01,1918-01-01
  14.         0x34,        //9  - 1919-01-01,1920-01-01
  15.         0x67,        //10 - 1921-01-01,1922-01-01
  16.         0x12,        //11 - 1923-01-01,1924-01-01
  17.         0x45,        //12 - 1925-01-01,1926-01-01
  18.         0x67,        //13 - 1927-01-01,1928-01-01
  19.         0x23,        //14 - 1929-01-01,1930-01-01
  20.         0x45,        //15 - 1931-01-01,1932-01-01
  21.         0x71,        //16 - 1933-01-01,1934-01-01
  22.         0x23,        //17 - 1935-01-01,1936-01-01
  23.         0x56,        //18 - 1937-01-01,1938-01-01
  24.         0x71,        //19 - 1939-01-01,1940-01-01
  25.         0x34,        //20 - 1941-01-01,1942-01-01
  26.         0x56,        //21 - 1943-01-01,1944-01-01
  27.         0x12,        //22 - 1945-01-01,1946-01-01
  28.         0x34,        //23 - 1947-01-01,1948-01-01
  29.         0x67,        //24 - 1949-01-01,1950-01-01
  30.         0x12,        //25 - 1951-01-01,1952-01-01
  31.         0x45,        //26 - 1953-01-01,1954-01-01
  32.         0x67,        //27 - 1955-01-01,1956-01-01
  33.         0x23,        //28 - 1957-01-01,1958-01-01
  34.         0x45,        //29 - 1959-01-01,1960-01-01
  35.         0x71,        //30 - 1961-01-01,1962-01-01
  36.         0x23,        //31 - 1963-01-01,1964-01-01
  37.         0x56,        //32 - 1965-01-01,1966-01-01
  38.         0x71,        //33 - 1967-01-01,1968-01-01
  39.         0x34,        //34 - 1969-01-01,1970-01-01
  40.         0x56,        //35 - 1971-01-01,1972-01-01
  41.         0x12,        //36 - 1973-01-01,1974-01-01
  42.         0x34,        //37 - 1975-01-01,1976-01-01
  43.         0x67,        //38 - 1977-01-01,1978-01-01
  44.         0x12,        //39 - 1979-01-01,1980-01-01
  45.         0x45,        //40 - 1981-01-01,1982-01-01
  46.         0x67,        //41 - 1983-01-01,1984-01-01
  47.         0x23,        //42 - 1985-01-01,1986-01-01
  48.         0x45,        //43 - 1987-01-01,1988-01-01
  49.         0x71,        //44 - 1989-01-01,1990-01-01
  50.         0x23,        //45 - 1991-01-01,1992-01-01
  51.         0x56,        //46 - 1993-01-01,1994-01-01
  52.         0x71,        //47 - 1995-01-01,1996-01-01
  53.         0x34,        //48 - 1997-01-01,1998-01-01
  54.         0x56,        //49 - 1999-01-01,2000-01-01
  55.         0x12,        //50 - 2001-01-01,2002-01-01
  56.         0x34,        //51 - 2003-01-01,2004-01-01
  57.         0x67,        //52 - 2005-01-01,2006-01-01
  58.         0x12,        //53 - 2007-01-01,2008-01-01
  59.         0x45,        //54 - 2009-01-01,2010-01-01
  60.         0x67,        //55 - 2011-01-01,2012-01-01
  61.         0x23,        //56 - 2013-01-01,2014-01-01
  62.         0x45,        //57 - 2015-01-01,2016-01-01
  63.         0x71,        //58 - 2017-01-01,2018-01-01
  64.         0x23,        //59 - 2019-01-01,2020-01-01
  65.         0x56,        //60 - 2021-01-01,2022-01-01
  66.         0x71,        //61 - 2023-01-01,2024-01-01
  67.         0x34,        //62 - 2025-01-01,2026-01-01
  68.         0x56,        //63 - 2027-01-01,2028-01-01
  69.         0x12,        //64 - 2029-01-01,2030-01-01
  70.         0x34,        //65 - 2031-01-01,2032-01-01
  71.         0x67,        //66 - 2033-01-01,2034-01-01
  72.         0x12,        //67 - 2035-01-01,2036-01-01
  73.         0x45,        //68 - 2037-01-01,2038-01-01
  74.         0x67,        //69 - 2039-01-01,2040-01-01
  75.         0x23,        //70 - 2041-01-01,2042-01-01
  76.         0x45,        //71 - 2043-01-01,2044-01-01
  77.         0x71,        //72 - 2045-01-01,2046-01-01
  78.         0x23,        //73 - 2047-01-01,2048-01-01
  79.         0x56,        //74 - 2049-01-01,2050-01-01
  80.         0x71,        //75 - 2051-01-01,2052-01-01
  81.         0x34,        //76 - 2053-01-01,2054-01-01
  82.         0x56,        //77 - 2055-01-01,2056-01-01
  83.         0x12,        //78 - 2057-01-01,2058-01-01
  84.         0x34,        //79 - 2059-01-01,2060-01-01
  85.         0x67,        //80 - 2061-01-01,2062-01-01
  86.         0x12,        //81 - 2063-01-01,2064-01-01
  87.         0x45,        //82 - 2065-01-01,2066-01-01
  88.         0x67,        //83 - 2067-01-01,2068-01-01
  89.         0x23,        //84 - 2069-01-01,2070-01-01
  90.         0x45,        //85 - 2071-01-01,2072-01-01
  91.         0x71,        //86 - 2073-01-01,2074-01-01
  92.         0x23,        //87 - 2075-01-01,2076-01-01
  93.         0x56,        //88 - 2077-01-01,2078-01-01
  94.         0x71,        //89 - 2079-01-01,2080-01-01
  95.         0x34,        //90 - 2081-01-01,2082-01-01
  96.         0x56,        //91 - 2083-01-01,2084-01-01
  97.         0x12,        //92 - 2085-01-01,2086-01-01
  98.         0x34,        //93 - 2087-01-01,2088-01-01
  99.         0x67,        //94 - 2089-01-01,2090-01-01
  100.         0x12,        //95 - 2091-01-01,2092-01-01
  101.         0x45,        //96 - 2093-01-01,2094-01-01
  102.         0x67,        //97 - 2095-01-01,2096-01-01
  103.         0x23,        //98 - 2097-01-01,2098-01-01
  104.         0x45,        //99 - 2099-01-01,2100-01-01
  105. };
复制代码
(2)根据当天距离当年元旦的天数差和当年元旦的星期日计算当天的星期日。
星期日=(当年元旦的星期日 + (当天距离当年元旦的天数差 % 7)) % 7
计算结果0对应星期天,1~6对应星期一~星期六,如有必要,星期天转为7输出。

计算程序:
  1. //******************************************************************
  2. // 函数名        :unsigned char Get_Weekday(unsigned int Year,unsigned char Month,unsigned char Date)
  3. // 功能                :计算星期日
  4. // 参数                :年(范围:1901~2099),月,日
  5. // 返回值        :星期日(1 ~ 7对应星期一 ~ 星期日)
  6. // 备注                :
  7. //******************************************************************
  8. unsigned char Get_Weekday(unsigned int Year,unsigned char Month,unsigned char Date)
  9. {
  10.         unsigned int        Days_After_New_Years_Day;        //公历日离当年元旦的天数
  11.         unsigned char        Table_Offset;                        //农历特征数据表格查表偏移量
  12.         unsigned char        New_Years_Day_Weekday;                //元旦对应星期日
  13.         unsigned char        Return_Value;                        //返回值
  14.         
  15.         
  16.         Return_Value = 0xff;        //默认返回无效值
  17.         
  18.         if((Year >= C_SOLAR_YEAR_MIN) && (Year <= C_SOLAR_YEAR_MAX))        //公历年范围
  19.         {
  20.                 Table_Offset = ((Year - C_SOLAR_YEAR_MIN) / 2);        //年份与1901年的差值 / 2
  21.                
  22.                 if(Year & 0x01)        //奇数年份
  23.                 {
  24.                         New_Years_Day_Weekday = (New_Years_Day_Weekday_Table[Table_Offset] >> 4);        //元旦对应星期日
  25.                 }
  26.                 else        //偶数年份
  27.                 {
  28.                         New_Years_Day_Weekday = (New_Years_Day_Weekday_Table[Table_Offset] & 0x0f);        //元旦对应星期日
  29.                 }
  30.                
  31.                 /* 计算公历日离当年元旦的天数 */
  32.                 Days_After_New_Years_Day = Days_Code[Month] + Date - 1;
  33.         
  34.                 /* 如果公历月大于2月并且该年的2月为闰月,天数加1 */
  35.                 if (Month > 2)
  36.                 {
  37.                         if((Year % 100) == 0)        //能被100整除
  38.                         {
  39.                                 if((Year % 400) == 0)        //能被400整除--闰年
  40.                                 {
  41.                                         Days_After_New_Years_Day ++;
  42.                                 }
  43.                         }
  44.                         else if (Year % 4 == 0)        //不能被100整除,能被4整除--闰年
  45.                         {
  46.                                 Days_After_New_Years_Day ++;
  47.                         }
  48.                 }
  49.                
  50.                 Return_Value = (New_Years_Day_Weekday + (Days_After_New_Years_Day % 7));        //元旦的星期日 + (天数差 % 7)
  51.                 Return_Value = (Return_Value % 7);        //(元旦的星期日 + (天数差 % 7) % 7)
  52.                
  53.                 if(Return_Value == 0)        //星期日的值由0改为7
  54.                 {
  55.                         Return_Value = 7;
  56.                 }
  57.         }
  58.         
  59.         return        Return_Value;        //返回值
  60. }
复制代码

计算实例:
unsigned charWeekday;

         Weekday = Get_Weekday(2025, 7, 25);
        if(Weekday != 0xff)       //结果正常

       {

              ……
       }

经过与使用基姆拉尔森计算公式结果比较,1901.1.1~2099.12.31两种方法计算结果相同,查表法计算量少一些。每年元旦的星期日实际上只需3为表示,可以用一个字节表示当年是不是闰年,这样,计算量还可以减少一些。


最终实现效果:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2024-11-2 20:22:34 | 显示全部楼层
谢谢分享,现在还没看懂
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-2 22:36:29 | 显示全部楼层
wiisir 发表于 2024-11-2 20:22
谢谢分享,现在还没看懂

使用查表法,还是比较容易看懂的。
回复 支持 反对

使用道具 举报

发表于 2025-1-12 21:33:15 | 显示全部楼层
谢谢分享,请教一下,上面几个程序同时应用,还是只用后面的呢,小白提问,还是麻烦回复一下。谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-1-12 22:53:15 | 显示全部楼层
zhangth 发表于 2025-1-12 21:33
谢谢分享,请教一下,上面几个程序同时应用,还是只用后面的呢,小白提问,还是麻烦回复一下。谢谢 ...

上面的程序实现了公历-农历转换、24节气对应公历日、天干地支年份和生肖年份转换、公历-星期日转换,如果只想实现某个功能,只需某个楼层的程序,比如公历-农历转换只需1楼的程序。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-1 19:04 , Processed in 0.296400 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表