首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

哪位高手能给个日期换算的算法程序?最好是C语言的,多谢

2012-03-14 
谁能给个日期换算的算法程序?最好是C语言的,谢谢!如题!再次感谢![解决办法]日期是浮点数,borland TDatetim

谁能给个日期换算的算法程序?最好是C语言的,谢谢!
如题!再次感谢!

[解决办法]
日期是浮点数,
borland TDatetime 类型的整数部分是从1899年12月30日开始的天数,
mssql 中的Datetime 整数部分是从1900年1月1日开始的天数,(和borland 差2天,为啥?)

小数部分是 当天的时间,通常可以理解为当天的百分比。

[解决办法]
//根据离公元元年的日期数,反计算出日期
void DaysToDate(XInt iDays,XInt &iYear,XInt &iMonth,XInt &iDay)
{
if( iDays < 1 || iDays > MAX_DAYS) iDays = XLongDate::RoundDate(iDays);
XInt N400 = iDays / 146097;
XInt D = iDays % 146097;
XInt N100 = D / 36524;
D = D % 36524;
XInt N4 = D / 1461;
D = D % 1461;
XInt N = D / 365;
D = D % 365;
XInt NYear = N400 * 400 + N100 * 100 + N4 * 4 + N;
XInt TDays = 0;
//int iYear,iMonth,iDay;
if( D > 0)
{
NYear ++;
iYear = NYear;
for(XInt i=1;i <13;i++)
{
TDays += GetMonthDays(NYear,i);
if( D <= TDays )
{
iMonth = i;
iDay = D - TDays + GetMonthDays(NYear,i);
break;
}
}
}
else
{
iYear = NYear;
iMonth = 12;
iDay = 31;
}
}

//输入年月日,计算出从公元元年开始总共的天数,并将结果返回。
XInt GetDays(XInt aYear,XInt aMonth,XInt aDay)
{
if( aYear <1 || aYear > 9999 ) throw XEDateTimeError(DATETIME_INVALIDATION_YEAR,aYear);
if( aMonth <1 || aMonth > 12 ) throw XEDateTimeError(DATETIME_INVALIDATION_MONTH,aMonth);
XInt aMonthDay = GetMonthDays( aYear, aMonth );
if( aDay <1 || aDay > aMonthDay ) throw XEDateTimeError(DATETIME_INVALIDATION_DAY,aDay);
XInt Days=0;
for(XInt i=1;i <aMonth;i++)
{
Days += GetMonthDays(aYear,i);
}
aYear--;
Days += ( (aYear*365) + (aYear/4) - (aYear/100) + (aYear/400));
Days += aDay;
return Days;
}

// 取对应年月的这个月的天数,并将结果以XInt的类型返回
XInt GetMonthDays(XInt aYear,XInt aMonth)
{
static XInt MonthDays[] = {31,28,31,30,31,30,31,31,30,31,30,31};
if( aMonth == 2 ){
if( IsRawYear(aYear) ) return MonthDays[1]+1;
else return MonthDays[1];
}
else return MonthDays[aMonth-1];
}
// 判断该年份是否是闰年,并返回一个XBool的值。

XBool IsRawYear(XInt aYear)
{
if( aYear <0 || aYear > 9999 )
{
throw XEDateTimeError(DATETIME_INVALIDATION_YEAR,aYear);
}
bool bFlag=false;
if( aYear %4 == 0 ) {
bFlag=true; //如果被4整除,是闰年
if( aYear %100 == 0 ){
bFlag=false; //如果被4整除且被100整除,不是闰年
if( aYear %400 == 0 ){
bFlag=true; //如果被4整除且被100整除,但又被400整除,是闰年
}
}
}
return bFlag;
}


求星期:天数%7即可,0表示星期天,1表示星期一

热点排行