中国阳历农历的转换

来源:互联网 发布:vscode搭建本地服务器 编辑:程序博客网 时间:2024/04/27 17:08

公司开发新项目,要在先前产品添加些新的功能,其中一项关于日历。有日历那么不可避免地涉及到阳历和农历之间的转换。

这个项目本不是我做的,但出于好奇,在网上搜索了相关资料,才发现中国的文化果然是博大精深,本来理所当然地想在网上找到一个农历阳历转换的公式,搜索之后才发现是我想多了。中国的农历根本就没有一个固定的公式,也可以所没有一个固定的规律,因为他是根据天象来定的。每一个闰年的月份都不一样,天数都不一样。那就奇了怪了,这要如何实现他的功能呢?想了老半天,想不出来,在网上看了相关的帖子,功夫不负有心人,终于让我找到了。原来是用两个数组解决了。到底是怎么解决的呢?下面来分析

//用0-12表示1年中的闰月月份,如果没有闰月,则用0表示//农历一九九零年正月初一对应阳历1900年1月31日const uint8_t CChineseCalendarDB::mc_leapMonth [YEAR_NUM]={    0x08, 0x00, 0x00, 0x05, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, //1900-1909    0x00, 0x06, 0x00, 0x00, 0x05, 0x00, 0x00, 0x02, 0x00, 0x07, //1910-1919    0x00, 0x00, 0x05, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, //1920-1929    0x06, 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, 0x00, 0x07, 0x00, //1930-1939    0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x07, //1940-1949    0x00, 0x00, 0x05, 0x00, 0x00, 0x03, 0x00, 0x08, 0x00, 0x00, //1950-1959    0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x07, 0x00, //1960-1969    0x00, 0x05, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x06, //1970-1979    0x00, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x00, 0x06, 0x00, 0x00, //1980-1989    0x05, 0x00, 0x00, 0x03, 0x00, 0x08, 0x00, 0x00, 0x05, 0x00, //1990-1999    0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x05, //2000-2009    0x00, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x06, 0x00, 0x00, //2010-2019    0x04, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x05, 0x00, //2020-2029    0x00, 0x03, 0x00, 0x0B, 0x00, 0x00, 0x06, 0x00, 0x00, 0x05, //2030-2039    0x00, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x05, 0x00, 0x00  //2040-2049};
//1901-2050年的每1个月有多少天,0表示29天,1表示30天const uint16_t CChineseCalendarDB::mc_monthDay[YEAR_NUM]={0x16D2, 0x0752, 0x0EA5, 0x164A, 0x064B, 0x0A9B, 0x1556, 0x056A, 0x0B59, 0x1752, //1900-1909    0x0752, 0x1B25, 0x0B25, 0x0A4B, 0x12AB, 0x0AAD, 0x056A, 0x0B69, 0x0DA9, 0x1D92, //1910-1919    0x0D92, 0x0D25, 0x1A4D, 0x0A56, 0x02B6, 0x15B5, 0x06D4, 0x0EA9, 0x1E92, 0x0E92, //1920-1929    0x0D26, 0x052B, 0x0A57, 0x12B6, 0x0B5A, 0x06D4, 0x0EC9, 0x0749, 0x1693, 0x0A93, //1930-1939    0x052B, 0x0A5B, 0x0AAD, 0x056A, 0x1B55, 0x0BA4, 0x0B49, 0x1A93, 0x0A95, 0x152D, //1940-1949    0x0536, 0x0AAD, 0x15AA, 0x05B2, 0x0DA5, 0x1D4A, 0x0D4A, 0x0A95, 0x0A97, 0x0556, //1950-1959    0x0AB5, 0x0AD5, 0x06D2, 0x0EA5, 0x0EA5, 0x064A, 0x0C97, 0x0A9B, 0x155A, 0x056A, //1960-1969    0x0B69, 0x1752, 0x0B52, 0x0B25, 0x164B, 0x0A4B, 0x14AB, 0x02AD, 0x056D, 0x0B69, //1970-1979    0x0DA9, 0x0D92, 0x1D25, 0x0D25, 0x1A4D, 0x0A56, 0x02B6, 0x05B5, 0x06D5, 0x0EC9, //1980-1989    0x1E92, 0x0E92, 0x0D26, 0x0A56, 0x0A57, 0x14D6, 0x035A, 0x06D5, 0x16C9, 0x0749, //1990-1999    0x0693, 0x152B, 0x052B, 0x0A5B, 0x155A, 0x056A, 0x1B55, 0x0BA4, 0x0B49, 0x1A93, //2000-2009    0x0A95, 0x052D, 0x0AAD, 0x0AAD, 0x15AA, 0x05D2, 0x0DA5, 0x1D4A, 0x0D4A, 0x0C95, //2010-2019    0x152E, 0x0556, 0x0AB5, 0x15B2, 0x06D2, 0x0EA9, 0x0725, 0x064B, 0x0C97, 0x0CAB, //2020-2029    0x055A, 0x0AD6, 0x0B69, 0x1752, 0x0B52, 0x0B25, 0x1A4B, 0x0A4B, 0x04AB, 0x055B, //2030-2039    0x05AD, 0x0B6A, 0x1B52, 0x0D92, 0x1D25, 0x0D25, 0x0A55, 0x14AD, 0x04B6, 0x05B5, //2040-2049};

 

两个数组包含了1990到2049年150年的农历信息,包括一年是否闰年,闰哪 一个月,每一个月有多少天等等。这就可以不用自己绞尽脑汁去想农历阳历的转换公式了。

 

小弟是新手,自己写的第一篇文章,水平不高,不要见怪……


 

原创粉丝点击