#include
int LunarCalendar( int year, int *pmonth, int *pday)
{
const int MonthAdd[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
const int LunarCalendarTable[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 DateCount,loop;
int i,j,n,Bit;
int month,day;
month = *pmonth;
day = *pday;
//计算从1921年2月8日(正月初一)到现在所经历的天数。
DateCount = (year - 1921) * 365 + (year - 1921) / 4 + MonthAdd[month - 1] - 38 + day;
//如今年阳历是闰年(2月有29天),而且当前月份大于2月,经历的总天数加1。
if ((!(year % 4)) && (month > 2))
DateCount = DateCount + 1;
//下面是查表的算法。
loop = 1;
j = 0;
while (loop)
{
if (LunarCalendarTable[j] < 4095)
i = 11;
else
i = 12;
n = i;
while (n>=0)
{
Bit = LunarCalendarTable[j];
Bit = (Bit >> n) & 1;
if (DateCount <= (29 + Bit))
{
loop = 0;
break ;
}
DateCount -= 29 + Bit;
n--;
}
if (!loop)
break ;
j++;
}
year = 1921 + j;
month = i - n + 1;
day = DateCount;
if (i == 12)
{
上一篇:多功能AT89C2051倒计时器