C语言版-农历算法
这个只是基本的农历算法,另外的节日查询啊,可以自己做的。到网站找一个万年历,改写成C语言的就可以了。
char *GetDayOf(SYSTEMTIME pSt)
{
const char *cTianGan[] = {"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"};
const char *cDiZhi[] = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"};
const char *cShuXiang[] = {"鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"};
const char *cDayName[] = {"*", "初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十", "廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十"};
const char *cMonName[] = {"*", "正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "腊"};
const int wMonthAdd[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
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;
TCHAR szNongli[512], szNongliDay[512];
wCurYear = pSt.wYear;
wCurMonth = pSt.wMonth;
wCurDay = pSt.wDay;
nTheDate = (wCurYear - 1921) * 365 + (wCurYear - 1921) / 4 + wCurDay + wMonthAdd[wCurMonth - 1] - 38;
if ((!(wCurYear % 4)) && (wCurMonth > 2)) nTheDate = nTheDate + 1;
nIsEnd = 0; m = 0;
while (nIsEnd != 1)
{
if (wNongliData[m] < 4095)
k = 11;
else
k = 12;
n = k;
while (n >= 0)
{
nBit = wNongliData[m];
for (i = 1;i < n + 1;i++) nBit = nBit / 2;
nBit = nBit % 2;
if (nTheDate <= (29 + nBit))
{
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;
}
wsprintf(szNongli, "%s%s年 (%s年) ", cTianGan[((wCurYear - 4) % 60) % 10], cDiZhi[((wCurYear - 4) % 60) % 12], cShuXiang[((wCurYear - 4) % 60) % 12]);
if (wCurMonth < 1)
wsprintf(szNongliDay, "闰%s月", cMonName[ -1 * wCurMonth]);
else wsprintf(szNongliDay, "%s月", cMonName[wCurMonth]);
strcat(szNongliDay, cDayName[wCurDay]);
return strcat(szNongli, szNongliDay);
}
转:http://www.shuax.com/?p=20