农历年月日时
__property int cYear={read=FcYear,write=SetcYear};
__property int cMonth={read=FcMonth,write=SetcMonth};
__property int cDay={read=FcDay,write=SetcDay};
__property int cTime={read=FcTime,write=SetcTime};
//公历农历日期字符串
__property AnsiString DateString={read=GetDateString};
__property AnsiString cDateString={read=GetcDateString};
//其他属性
__property TDateTime DateTime={read=TheDate,write=SetDate};
__property TDateTime LastJie = { read=GetLastJie };
__property TDateTime NextJie = { read=GetNextJie };
__property TDateTime LastQi = { read=GetLastQi };
__property TDateTime NextQi = { read=GetNextQi };
__property int DayOfWeek = { read=GetDayOfWeek };
__property AnsiString WeekString = { read=GetWeekString };
__published:
};
//---------------------------------------------------------------------------
#endif
下面介绍转换的具体算法。
一、公历转换成农历
1、计算出所求时间到起始年正月初一的天数。
2、从起始年份开始,减去每一月的天数,一直到剩余天数没有下一个月多为止
此时,ChineseCalendarData的下标到了多少,就是减去了多少年,用起始年份加上这个下标就可以得到农历年份;然后看减去了几个月,如果本年不闰月或者闰月还在后面,就可以直接得到农历月份,如果在闰月月份数后面一个月,则这个月就是闰月,如果在闰月的后面,则要减去1才能得到月份数;剩余的天数就是农历日;农历时用(公历时+1)/2就可以简单地得到了。具体的代码如下:
//---------------------------------------------------------------------------
void __fastcall ThsDivineCalendar::e2c()
{
int total,m,n,k;
bool isEnd=false; //用以判断是否不够减了
total=(int)TheDate-7709; //到1921-2-8(正月初一)的天数
for(m=0;;m++)
{
/*判断本年是否闰月,用以确定月份信息的起点
有闰月有13位(0~12),无12位(0~11)*/
k=(ChineseCalendarData[m]<0xfff)?11:12; for(n=k;n>=0;n--)
{
//如果不够减
if(total<=29+GetBit(ChineseCalendarData[m],n))
{
isEnd=true; //设置标志
break; //退出内层循环
}
/*够减,减去一个月的天