我刚好有资源,这是我原创的程序,里面的数据压缩方式、转换、参考点等,都是自行设计的,能够准确地将公历转农历,将农历转公历,同时还提供一个自行设计的农历库,附带例程,还有农历信息提取工具,可以自定义年份区间(1600-7000)。
农历信息提取器生成的头文件(这里限于篇幅,只取10年跨度)
/*****************************************************
* 农历信息(查表方式) *
* 生成时间:2014/12/25 *
*****************************************************/
#ifndef _LUNARDATA_H
#define _LUNARDATA_H
#define START_YEAR 1600 //定义数据起始年份(公历)
#define END_YEAR 1610 //定义数据终止年份(不包含该年)
short iPreLeapIndex=-1;//起始年份以前的农历闰月索引,对应iPreMonth中的序号,如果是-1则代表无闰月。
//从起始年份前一年的农历十月开始,每月初一对应在起始年份中的年内序数,
//序数小于零代表起始年份之前。
short iPreMonth[3]={-44,-15,15};
//每年农历正月初一的日期在公历年内的序数(年内序数指定元旦为0)。
unsigned char uLunarNewYearOrdinal[10]={
44,33,22,41,30,48,37,27,46,34 //1600-1609
};
//月份大小数组,从“START_YEAR”的正月到“END_YEAR”前一年的(闰)十二月。
//每年十二或十三个月用两个字节表示,最高两位定为10,后面从正月开始到十二月,包含闰月。月份小的在前,
//1 0 0或1 x x x x x x x x x x x x x
//1 0 12个月为0,13个月为1 从正月到十二月,月份天数29天则为0,月份天数30天则为1。
//注意,如果没有闰月,月份位为12位,总长度是15位,有闰月,月份位为13位,总长度是16位。
unsigned short LunarMonthDX[10]={
0x4A5D,0x492D,0xB92B,0x4A95,0xB695,0x46AA,0x4AD5,0xAAB5,0x44BA,0x4A5B //1600-1609
};
//闰月数组,用4位表示一个农历年内的闰月信息,一个字节表示相邻两年。
// x x x x x x x x
// 年份① 年份②
unsigned char LeapMonth[5]={
0x00,0x20,0x90,0x06,0x00 //1600-1609
};
//24节气数组,一年用12个字节表示,即每个月用一个字节(注意:此压缩算法适用于公元1600以后的数据)。
//如1901年的节气为:
// 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
// 6, 21, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 23, 8, 24, 8, 24, 8, 24, 8, 23, 8, 22
// 9, 6, 11, 4, 9, 6, 10, 6, 9, 7, 9, 7, 7, 8, 7, 9, 7, 9, 7, 9, 7, 8, 7, 15
//小寒 大寒 立春 雨水 惊蛰 春分 清明 谷雨 立夏 小满 芒种 夏至 小暑 大暑 立秋 处暑 白露 秋分 寒露 霜降 立冬 小雪 大雪 冬至
//这样每月两个节气对应数据都小于16,每月用一个字节存放,高位存放第一个节气数据,低位存放第二个节气的数据,可得下表:
unsigned char SolarTerms[120]={
0x96,0x96,0x87,0x97,0x87,0x97,0x87,0x96,0x96,0x96,0x96,0x96, //1600
0xA6,0xA5,0x87,0x87,0x87,0x87,0x87,0x97,0x96,0x97,0x96,0x96, //1601
0x96,0xA5,0x88,0x87,0x88,0x87,0x87,0x87,0x96,0x87,0x96,0x97, //1602
0x96,0xA6,0x78,0x87,0x78,0x87,0x88,0x87,0x97,0x87,0x96,0x87, //1603
0x96,0x96,0x87,0x97,0x87,0x97,0x87,0x96,0x96,0x96,0xA6,0x96, //1604
0xA6,0xA5,0x87,0x87,0x87,0x87,0x87,0x97,0x96,0x96,0x96,0x96, //1605
0x96,0xA5,0x88,0x87,0x88,0x87,0x87,0x87,0x96,0x87,0x96,0x97, //1606
0x96,0xA5,0x78,0x87,0x78,0x87,0x88,0x87,0x97,0x87,0x96,0x87, //1607
0x96,0x96,0x87,0x97,0x87,0x96,0x87,0x96,0x96,0x96,0xA6,0x96, //1608
0xA6,0xA5,0x87,0x87,0x87,0x87,0x87,0x97,0x96,0x96,0x96,0x96 //1609
};
//每年数九、入梅、出梅及三伏日期(以该年元旦为基准)。
//公历年内首个是三九(适用于公元1600年以后)。
//数组中,每一行表示一年,四九、五九……省略,输在每个九相差9天,同理二九省略,中伏在初伏后10天。分别对应如下(括号中的已省略):
//三九 (四九 五九 六九 七九 八九 九九) 入梅 出梅 初伏 (中伏) 末伏 一九 (二九),注意:一九就是冬至。
unsigned short ExtermSeason[60]={
8,165,190,199,219,355,7,159,196,193,223,355, //1600-1601
7,164,191,198,218,355,8,159,198,193,223,355, //1602-1603
8,164,193,198,218,355,7,158,199,202,222,355, //1604-1605
7,163,194,197,227,355,8,158,189,202,222,355, //1606-1607
8,163,196,197,227,355,7,167,190,201,221,354 //1608-1609
};
#endif //_LUNARDATA_H