void GetLunarDate( LPTSTR &pstrLunarMonth, LPTSTR &pstrLunarDay, unsigned short uYear, unsigned short uMonth, unsigned short uDay ) { const int nMonthAdd[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; const int nLunarData[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 }; int nTheDate, nIsEnd, m, k, n, i, nBit; nTheDate = (uYear - 1921) * 365 + (uYear - 1921) / 4 + uDay + nMonthAdd[uMonth - 1] - 38; if ((!(uYear % 4)) && (uMonth > 2)) nTheDate = nTheDate + 1; nIsEnd = 0; m = 0; while (nIsEnd != 1) { if (nLunarData[m] < 4095) k = 11; else k = 12; n = k; while (n >= 0) { nBit = nLunarData[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; } int nCurMonth = k - n + 1; if (k == 12) { if (nCurMonth == nLunarData[m] / 65536 + 1) nCurMonth = 1 - nCurMonth; else if (nCurMonth > nLunarData[m] / 65536 + 1) nCurMonth = nCurMonth - 1; } if (nCurMonth < 1) wcscat_s(pstrLunarMonth, sizeof(TCHAR), _T("闰")); wcscat_s(pstrLunarMonth, sizeof(TCHAR) * wcslen(gszMonth[nCurMonth]), gszMonth[nCurMonth]); wcscat_s(pstrLunarDay, sizeof(TCHAR) * wcslen(gszDay[nTheDate]), gszDay[nTheDate]); }