这个是该部分运行的结果
实际的日期
下面是农历部分代码
/*************************************************************************************
* 函数名:农历查询
* 入口参数:year,month,day
* 调用函数:
*************************************************************************************/
void Lunar_Calendar(int year ,int month,int day) {
/*天干名称*/
const char *cTianGan[] = {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
/*地支名称*/
const char *cDiZhi[] = {"子","丑","寅","卯","辰","巳","午",
"未","申","酉","戌","亥"
};
/*属相名称*/
const char *cShuXiang[] = {"鼠","牛","虎","兔","龙","蛇",
"马","羊","猴","鸡","狗","猪"
};
/*农历日期名*/
const char *cDayName[] = {"*","初一","初二","初三","初四","初五",
"初六","初七","初八","初九","初十",
"十一","十二","十三","十四","十五",
"十六","十七","十八","十九","二十",
"廿一","廿二","廿三","廿四","廿五",
"廿六","廿七","廿八","廿九","三十"
};
/*农历月份名*/
const char *cMonName[] = {"*","正","二","三","四","五","六",
"七","八","九","十","十一","腊"
};
/*公历每月前面的天数*/
const int wMonthAd[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
/***************************************************************
*农历数据计算方式:用十进制保存
*例如:1、农历每个月的大小;2、今年是否有闰月,闰几月以及闰月的大小。
用一个整数来保存这些信息就足够了。具体的方法是:用一位来表示一个月的大
小,大月记为1,小月记为0,这样就用掉12位(无闰月)或13位(有闰月),再
用高4位来表示闰月的月份,没有闰月记为0。比如说,2000年的信息数据是是0xC96
化为十进制就是3222,化成二进制就是110010010110B,表示的含义是指1、2、5、8、10、11月大,其余月小
****************************************************************/
/*农历数据*/
const int wNongliData[100] = {
2635,333387,1701,1748,267701,694,2391,133423,1175,396438
,3402,3749,331177,1453,694,201326,2350,465197,3221,3402
,400202,2901,1386,267611,605,2349,137515,2709,464533,1738
,2901,330421,1242,2651,199255,1323,529706,3733,1706,398762
,2741,1206,267438,2647,1318,204070,3477,461653,1386,2413
,330077,1197,2637,268877,3365,531109,2900,2922,398042,2395
,1179,267415,2635,661067,1701,1748,398772,2742,2391,330031
,1175,1611,200010,3749,527717,1452,2742,332397,2350,3222
,268949,3402,3493,133973,1386,464219,605,2349,334123,2709
,2890,267946,2773,592565,1210,2651,395863,1323,2707,265877
};
static int wCurYear,wCurMonth,wCurDay;
static int nTheDate,nIsEnd,m,k,n,i,nBit;
char szNongli[30], szNongliDay[10],szShuXiang[10];
/*—取当前公历年、月、日—*/
wCurYear = year;
wCurMonth = month;
wCurDay = day;
/*—计算到初始时间1921年2月8日的天数:1921-2-8(正月初一)—*/
/*1921年 鸡年 辛酉年*/
nTheDate = (wCurYear-1921) * 365 + (wCurYear-1921) / 4 + wCurDay + wMonthAd[wCurMonth-1]-38;
if((!(wCurYear % 4)) && (wCurMonth > 2)) //如今年阳历是闰年(2月有29天),而且当前月份大于2月,经历的总天数加1
nTheDate = nTheDate + 1;
/*–计算农历天干、地支、月、日—*/
nIsEnd = 0;
m = 0;
while(nIsEnd != 1) {
if(wNongliData[m] < 4095) //4095:111111111111 判断是否有闰月 小于则没有闰月 扣掉一个月
k = 11;
else
k = 12;
n = k;
while(n>=0) {
//获取wNongliData(m)的第n个二进制位的值
nBit = wNongliData[m];
for(i=1; i<n+1; i++) //大小月确定
nBit = nBit/2;
nBit = nBit % 2; //取出农历数据前12位的二进制数据
if (nTheDate <= (29 + nBit)) { //若为1则是大月 天数有30天
nIsEnd = 1; //大月
break;
}
nTheDate = nTheDate-29-nBit;//天数
n = n-1;
}
if(nIsEnd)
break;
m = m + 1;
}
wCurYear =1921 + m;
wCurMonth =k-n + 1; //农历月份
wCurDay = nTheDate; //农历天数
if (k == 12) { //存在闰月
if (wCurMonth == wNongliData[m] / 65536 + 1)//保存闰月是几月
wCurMonth =1-wCurMonth;
else if (wCurMonth > wNongliData[m] / 65536 + 1)
wCurMonth = wCurMonth-1;
}
/*–生成农历天干、地支、属相 ==> wNongli–*/
/************************************************************************
* 计算公式: 天干:(农历年份-3)Mod 10
* 地支:(农历年份-3)Mod 12
* 生肖:(Year-3) Mod 12
************************************************************************/
printf(" %s年 ",cShuXiang[(wCurYear - 4) % 12]);//属相
printf("%s",cTianGan[(wCurYear - 4) % 10]);//天干
printf("%s年 ",cDiZhi[(wCurYear - 4) % 12]);//地支
/*–生成农历月、日 ==> wNongliDay–*/
if (wCurMonth < 1) { //闰月
printf("闰");
printf("%s",cMonName[-1 * wCurMonth]);//农历月份确定
printf("月");
printf("%s",cDayName[wCurDay]);//农历日期确定
printf(" %s\n",Week_Day2(Week_Day1(year,month,day)));//星期的确定
} else {
printf("%s",cMonName[wCurMonth]);
printf("月 ");
printf("%s",cDayName[wCurDay]);
printf(" %s\n",Week_Day2(Week_Day1(year,month,day)));
}
}
谢谢!