void SunToLunar(const stDateTime* pSunDay,stDateTime* pLunarDay)
{
int i=0;
int SunDiff=0;
int SpringDiff=0; int nSpringYear=pSunDay->nYear;
int nSpringMonth=1;
int nSpringDay=0; //计算当前公历日离当年元旦的天数
SunDiff = MonthAdd[pSunDay->nMonth-1] + pSunDay->nDay - 1;
if(IsLeapYear(pSunDay->nYear) && (pSunDay->nMonth > 2) )//若是瑞年且大于2月,天数再加1
SunDiff++; //计算春节所在公历日离元旦的天数:通过查表,计算当年的春节所在的公历日期,
if(((LunarCalendarTable[pSunDay->nYear - 1901] & 0x60)>>5)==1)//若春节在公历1月
SpringDiff= (LunarCalendarTable[pSunDay->nYear-1901]&0x1F)-1;
else//若春节在公历2月
SpringDiff= (LunarCalendarTable[pSunDay->nYear-1901]&0x1F)-1+31; //SunDiff和SpringDiff的差就是当前公历日离春节的天数 if(SunDiff>SpringDiff)//公历日在春节后
{
int x = SunDiff - SpringDiff;
int bLunar = (LunarCalendarTable[nSpringYear - 1901] & 0xF00000)>>20;//闰月月份 i=0;
nSpringMonth=1; for(;;)
{
int a = (LunarCalendarTable[pSunDay->nYear-1901] & (0x80000>>i));//计算大小月
if(a==0)
a=29;
else
a=30;
if(x<a)
break;
x =x - a;
i++;
nSpringMonth++;
}
nSpringDay =x+1;
//如果有闰月
if(nSpringMonth>bLunar && bLunar>0)
nSpringMonth--;
}
else//公历日在春节前
{ int x = SpringDiff-SunDiff;
int nShift=0; int bLunar = (LunarCalendarTable[nSpringYear - 1901] & 0xF00000)>>20;//闰月月份 i=0;
nSpringYear--;//需要上一年的农历信息
nSpringMonth=12;//从最后一个月开始计算 if (bLunar == 0)//如果没有润月
nShift = 0x100;
else
nShift = 0x80; for(;;)
{
int a = (LunarCalendarTable[nSpringYear-1901] & (nShift<<i));//计算大小月
if(a==0)
a=29;
else
a=30; if(x<a)
{
x = a-x;
break;
}
x =x - a;
i++;
nSpringMonth--;
}
nSpringDay =x+1; if(nSpringMonth<bLunar && bLunar>0)
nSpringMonth++;
}
pLunarDay->nYear = nSpringYear;
pLunarDay->nMonth= nSpringMonth;
pLunarDay->nDay  = nSpringDay;
}

解决方案 »

  1.   

    unsigned int LunarCalendarTable[199] = 
    {
    0x4D4AB8,0x0D4A4C,0x0DA541,0x25AAB6,0x056A49,0x7AADBD,0x025D52,0x092D47,0x5C95BA,0x0A954E,/*2001-2010*/
    0x0B4A43,0x4B5537,0x0AD54A,0x955ABF,0x04BA53,0x0A5B48,0x652BBC,0x052B50,0x0A9345,0x474AB9,/*2011-2020*/
    0x06AA4C,0x0AD541,0x24DAB6,0x04B64A,0x69573D,0x0A4E51,0x0D2646,0x5E933A,0x0D534D,0x05AA43,/*2021-2030*/
    0x36B537,0x096D4B,0xB4AEBF,0x04AD53,0x0A4D48,0x6D25BC,0x0D254F,0x0D5244,0x5DAA38,0x0B5A4C,/*2031-2040*/
    0x056D41,0x24ADB6,0x049B4A,0x7A4BBE,0x0A4B51,0x0AA546,0x5B52BA,0x06D24E,0x0ADA42,0x355B37,/*2041-2050*/
    0x09374B,0x8497C1,0x049753,0x064B48,0x66A53C,0x0EA54F,0x06B244,0x4AB638,0x0AAE4C,0x092E42,/*2051-2060*/
    0x3C9735,0x0C9649,0x7D4ABD,0x0D4A51,0x0DA545,0x55AABA,0x056A4E,0x0A6D43,0x452EB7,0x052D4B,/*2061-2070*/};char *ChMonthTable[] = {"*","正","二","三","四","五","六","七","八","九","十","十一","腊"};