这个只是基本的农历算法,另外的节日查询啊,可以自己做的。到网站找一个万年历,改写成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);
}

原创文章,转载请注明: 转载自耍下
本文链接地址: C语言版-农历算法