公历转农历算法

 

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]);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值