您的位置:首页 > 其它

公历转农历算法

2015-07-22 18:37 513 查看
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]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: