数
先减去29天如果月大,则对应的信息位为1,
又减去一天*/
total=total-29-GetBit(ChineseCalendarData[m],n);
}
if(isEnd)break; //如果不够减,退出外层循环
}
FcYear=1921 + m; //农历年=起始年份+下标
FcMonth=k-n+1; //农历月=本年的月份数(k+1)减去已经减去的月份数(n)
FcDay=total; //农历日=剩余天数
unsigned short int t1,t2,t3,t4;
TheDate.DecodeTime(&t1,&t2,&t3,&t4);
FcTime=(t1+1)>>1; //农历时
if(k==12) //如果本年有闰月
{
if(FcMonth==ChineseCalendarData[m]/0x10000+1)//就是闰月
FcMonth=1-FcMonth;
if(FcMonth>ChineseCalendarData[m]/0x10000+1)//闰月后面
FcMonth--;
}
}
//----------------------------------------------------------------------------
二、农历到公历的转换
这个算法比较简单,只要计算所求时候到起始年正月初一的总天数就可以了,要计算总天数,只要统计出本月以前的大月小月书就可以了,然后把这个值赋予TdateTime类型的TheDate就可以用TdateTime的成员函数DecodeDate得到公历的年月日了。具体代码如下:
//----------------------------------------------------------------------------
void __fastcall ThsDivineCalendar::c2e()
{
int i,k,m,p,y={0,0};
//y[0]:小月、y:大月
//本年以前的大月小月数
for(i=0;i<FcYear-1921;i++)
{
k=(ChineseCalendarData[i]<0xfff)?11:12;
for(m=0;m<=k;m++)
y[GetBit(ChineseCalendarData[i],m)]++;
}
//统计本年本月以前的大月小月数
//本年不是闰年
if(ChineseCalendarData[i]<0xfff)
for(m=13-FcMonth;m<=11;m++)
y[GetBit(ChineseCalendarData[i],m)]++;
else // 是闰年
{
k=ChineseCalendarData[i]/0x10000;
//根据在闰月前后决定统计的起始位置
p=(FcMonth>k)?13-FcMonth:14-FcMonth;
if(k+FcMonth==0)p=13+FcMonth; //本月就是闰月
for(m=p;m<=12;m++)
y[GetBit(ChineseCalendarData[i],m)]++;
}
//7709就是1920年腊月三十
TheDate=7709+y[0]*29+y*30+FcDay+FcTime*2.0/24;
}
//----------------------------------------------------------------------------
void __fastcall ThsDivineCalendar::GetYMD()
{
unsigned short y,m,d,t;
TheDate.DecodeDate(&y,&m,&d);
FYear=y;
FMonth=m;
FDay=d;
TheDate.DecodeTime(&t,&y,&m,&d);
FTime=