0xaa,0x48,0x5a,0x01,0xb5,0x09,0xb0,0x39,0x64,0x05,0x25,0x75,0x95,0x0a,0x96,0x04,0x4d,0x54,0xad,0x04,0xda,0x04,0xd4,0x44,0xb4,0x05,0x54,0x85,0x52,0x0d,0x92,0x0a,0x56,0x6a,0x56,0x02,0x6d,0x02,0x6a,0x41,0xda,0x02,0xb2,0xa1,0xa9,0x05,0x49,0x0d,0x0a,0x6d,0x2a,0x09,0x56,0x01,0xad,0x50,0x6d,0x01,0xd9,0x02,0xd1,0x3a,0xa8,0x05,0x29,0x85,0xa5,0x0c,0x2a,0x09,0x96,0x54,0xb6,0x08,0x6c,0x09,0x64,0x45,0xd4,0x0a,0xa4,0x05,0x51,0x25,0x95,0x0a,0x2a,0x72,0x5b,0x04,0xb6,0x04,0xac,0x52,0x6a,0x05,0xd2,0x0a,0xa2,0x4a,0x4a,0x05,0x55,0x94,0x2d,0x0a,0x5a,0x02,0x75,0x61,0xb5,0x02,0x6a,0x03,0x61,0x45,0xa9,0x0a,0x4a,0x05,0x25,0x25,0x2d,0x09,0x9a,0x68,0xda,0x08,0xb4,0x09,0xa8,0x59,0x54,0x03,0xa5,0x0a,0x91,0x3a,0x96,0x04,0xad,0xb0,0xad,0x04,0xda,0x04,0xf4,0x62,0xb4,0x05,0x54,0x0b,0x44,0x5d,0x52,0x0a,0x95,0x04,0x55,0x22,0x6d,0x02,0x5a,0x71,0xda,0x02,0xaa,0x05,0xb2,0x55,0x49,0x0b,0x4a,0x0a,0x2d,0x39,0x36,0x01,0x6d,0x80,0x6d,0x01,0xd9,0x02,0xe9,0x6a,0xa8,0x05,0x29,0x0b,0x9a,0x4c,0xaa,0x08,0xb6,0x08,0xb4,0x38,0x6c,0x09,0x54,0x75,0xd4,0x0a,0xa4,0x05,0x45,0x55,0x95,0x0a,0x9a,0x04,0x55,0x44,0xb5,0x04,0x6a,0x82,0x6a,0x05,0xd2,0x0a,0x92,0x6a,0x4a,0x05,0x55,0x0a,0x2a,0x4a,0x5a,0x02,0xb5,0x02,0xb2,0x31,0x69,0x03,0x31,0x73,0xa9,0x0a,0x4a,0x05,0x2d,0x55,0x2d,0x09,0x5a,0x01,0xd5,0x48,0xb4,0x09,0x68,0x89,0x54,0x0b,0xa4,0x0a,0xa5,0x6a,0x95,0x04,0xad,0x08,0x6a,0x44,0xda,0x04,0x74,0x05,0xb0,0x25,0x54,0x03,};
确定阳历日和阴历日的对应关系的算法:
对于其他任何一个阳历日和阴历日的对应关系,都可以通过以下算法求得结果。
具体算法由如下函数get_lunar_day(void)实现:
说明:
函数get_lunar_day(void)的输入变量:
gc_solar_calendar_year和gc_solar_calendar_month
输出变量:
gc_lunar_calendar_year、gc_lunar_calendar_month和gc_lunar_calendar_date
voidget_lunar_day(void)/*计算出输入阳历年、阳历月,对应该阳历月第一天对应阴历时间,即阴历年、月、日*/
{unsignedchartemp_leap_month;
unsignedchartemp_flag;
unsignedcharcalculate_temp;
unsignedcharmc_tpumenus_temp_loop;
unsignedcharmc_tpumenus_temp_01;
temp_leap_month=0;temp_flag=1;
//条件初始化二次,减少运算数据量.
if(gc_solar_calendar_year>99)
{gc_lunar_calendar_year=99;gc_lunar_calendar_month=11;
gc_lunar_calendar_date=25;temp_total_day+=25;calculate_temp=100;}
else
{gc_lunar_calendar_year=0;gc_lunar_calendar_month=11;
gc_lunar_calendar_date=11;temp_total_day+=11;calculate_temp=1;}
if(gc_solar_calendar_year>calculate_temp||gc_solar_calendar_month>1)
{for(mc_tpumenus_temp_loop=1;mc_tpumenus_temp_loop>0;){
temp_total_day-=calendar_calculate_lunar_month_total_day();
temp_leap_month=tpumenus_lunar_calendar_month_table[2*gc_lunar_calendar_year+1];
temp_leap_month=(temp_leap_month>>4)&0x0F;
if(gc_lunar_calendar_month==temp_leap_month)
{switch(gc_lunar_calendar_year)
{case6,14,19,25,33,36,38,41,44,52,55,79,117,
136,147,150,155,158,185,193:
if(temp_total_day<31){gc_lunar_calendar_date=temp_total_day;
mc_tpumenus_temp_loop=0;temp_flag=0;}
elsetemp_total_day-=30;
break;//currentmonth:
temp_leap_month
default:
if(temp_total_day<30)
{gc_lunar_calendar_date=temp_total_day;mc_tpumenus_temp_loop=0;
temp_flag=0;/*currentmonth:
temp_leap_month*/}
elsetemp_total_day-=29;break;}}
if(temp_flag){gc_lunar_calendar_month++;
if(gc_lunar_calendar_month==13){gc_lunar_calendar_month=1;
gc_lunar_calendar_year++;}
If(temp_total_day<61)//iftemp_total_day>60,ignorecompare
{mc_tpumenus_temp_01=calendar_calculate_lunar_month_total_day();
if(temp_total_day<(mc_tpumenus_temp_01+1))
{mc_tpumenus_temp_loop=0;gc_lunar_calendar_date=temp_total_day;
}}
}}}
gc_lunar_leap_month=(temp_flag<<4)|temp_leap_month;/*setleap_monthflag*/
说明:
函数calendar_calculate_lunar_month_total_day(void)根据输入变量gc_lunar_calendar_year和gc_lunar_calendar_month,结合压缩数据表lunar_calendar_month_table计算出对应阴历月的总的天数。
unsignedcharcalendar_calculate_lunar_month_total_day(void)
{
unsignedcharmc_tpumenus_temp_01;
unsignedcharmc_tpumenus_temp_02;
if(gc_lunar_calendar_month<9)
{mc_tpumenus_temp_01=lunar_calendar_month_table[2*gc_lunar_calendar_year];
mc_tpumenus_temp_02=gc_lunar_calendar_month-1;}
else{
mc_tpumenus_temp_01=lunar_calendar_month_table[2*gc_lunar_calendar_year+1];
mc_tpumenus_temp_02=gc_lunar_calendar_month-9;}
if((mc_tpumenus_temp_01>>mc_tpumenus_temp_02)&0x01)return(29);
elsereturn(30);}
阳历日和农历节气的对应关系
压缩节气数据表:
根据规律可以得到四个数据表(每个阳历月有两个节气,每个节气需要两个数据表):
constunsignedcharcalendar_solar_term_table_01[12][33]={
{7,6,6,6,6,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,5,5,5,5,5,4,5,5},//month1
{5,4,5,5,5,4,4,5,5,4,4,4,4,4,4,4,4,3,4,4,4,3,3,4,4,3,3,3},//2
{6,6,6,7,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,6,5,5,5,5,4,5,5,5,5},//3
{5,5,6,6,5,5,5,6,5,5,5,5,4,5,5,5,4,4,5,5,4,4,4,5,4,4,4,4,5},//4
{6,6,6,7,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,6,5,5,5,5,4,5,5,5,5},//5
{6,6,7,7,6,6,6,7,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,6,5,5,5,5,4,5,5,5,5},//6
{7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7,6,6,6,7,7},//7
{8,8,8,9,8,8,8,8,7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7,7},//8
{8,8,8,9,8,8,8,8,7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,7},//9
{9,9,9,9,8,9,9,9,8,8,9,9,8,8,8,9,8,8,8,8,7,8,8,8,7,7,8,8,8},//10
{8,8,8,8,7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7,7},//11
{7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7,6,6,6,7,7},//12
};//这个数据表表示了每个月第一个节气出现的规律
constunsignedcharcalendar_solar_term_year_01[12][9]={
{13,49,85,117,149,185,201,250,250},//month1
{13,45,81,117,149,185,201,250,250},//2
{13,48,84,112,148,184,200,201,250},//3
{13,45,76,108,140,172,200,201,250},//4
{13,44,72,104,132,168,200,201,250},//5
{5,33,68,96,124,152,188,200,201},//6
{29,57,85,120,148,176,200,201,250},//7
{13,48,76,104,132,168,196,200,201},//8
{25,60,88,120,148,184,200,201,250},//9
{16,44,76,108,144,172,200,201,250},//10
{28,60,92,124,160,192,200,201,250},//11
{17,53,85,124,156,188,200,201,250},//12
};//这个数据表表示了每个月第一个节气出现规律对应的阳历年份范围
constunsignedcharcalendar_solar_term_table_02[12][29]={
{21,21,21,21,21,20,21,21,21,20,20,21,21,20,20,20,20,20,20,20,20,19,20,20,20,19,19,20},
{20,19,19,20,20,19,19,19,19,19,19,19,19,18,19,19,19,18,18,19,19,18,18,18,18,18,18,18},
{21,21,21,22,21,21,21,21,20,21,21,21,20,20,21,21,20,20,20,21,20,20,20,20,19,20,20,20,20},
{20,21,21,21,20,20,21,21,20,20,20,21,20,20,20,20,19,20,20,20,19,19,20,20,19,19,19,20,20},
{21,22,22,22,21,21,22,22,21,21,21,22,21,21,21,21,20,21,21,21,20,20,21,21,20,20,20,21,21},
{22,22,22,22,21,22,22,22,21,21,22,22,21,21,21,22,21,21,21,21,20,21,21,21,20,20,21,21,21},
{23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23,22,22,22,22,23},
{23,24,24,24,23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23,23},
{23,24,24,24,23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23,23},
{24,24,24,24,23,24,24,24,23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23,23,23},
{23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23,22,22,22,22,21,22,22,22,21,21,22,22,22},
{22,22,23,23,22,22,22,23,22,22,22,22,21,22,22,22,21,21,22,22,21,21,21,22,21,21,21,21,22},
};//这个数据表表示了每个月第二个节气出现的规律
constunsignedcharcalendar_solar_term_year_02[12][8]={
{13,45,81,113,149,185,201},{21,57,93,125,161,193,201},{21,56,88,120,152,188,200,201},
{21,49,81,116,144,176,200,201},{17,49,77,112,140,168,200,201},
{28,60,88,116,148,180,200,201},{25,53,84,112,144,172,200,201},
{29,57,89,120,148,180,200,201},{17,45,73,108,140,168,200,201},
{28,60,92,124,160,192,200,201},{16,44,80,112,148,180,200,201},
{17,53,88,120,156,188,200,201},};
//这个数据表表示了每个月第二个节气出现规律对应的阳历年份范围
每个阳历月对应的两个农历节气出现的日期,可根据条件规律算法,分别由以下两个函数实现:
unsignedcharcalendar_calculate_solar_term_1(void)
{
zpageunsignedchardone_index;
zpageunsignedcharsolar_term;
done_index=0;
while(gc_solar_calendar_year>=calendar_solar_term_year_01[gc_solar_calendar_month-1][done_index]){done_index++;}
solar_term=calendar_solar_term_table_01[gc_solar_calendar_month-1][4*done_index+gc_solar_calendar_year%4];
if((gc_solar_calendar_year==121)&&(gc_solar_calendar_month==4))solar_term=5;
if((gc_solar_calendar_year==132)&&(gc_solar_calendar_month==4))solar_term=5;
if((gc_solar_calendar_year==194)&&(gc_solar_calendar_month==6))solar_term=6;
return(solar_term);
}//计算阳历月对应的第一个节气
unsignedcharcalendar_calculate_solar_term_2(void)
{
zpageunsignedchardone_index;
zpageunsignedcharsolar_term;
done_index=0;
while(gc_solar_calendar_year>=calendar_solar_term_year_02[gc_solar_calendar_month-1][done_index]){done_index++;}
solar_term=calendar_solar_term_table_02[gc_solar_calendar_month-1][4*done_index+gc_solar_calendar_year%4];
if((gc_solar_calendar_year==171)&&(gc_solar_calendar_month==3))solar_term=21;
if((gc_solar_calendar_year==181)&&(gc_solar_calendar_month==5))solar_term=21;
return(solar_term);
}//计算阳历月对应的第二个节气
以上就是万年历的完整算法。
它首先计算出对