开发工作中写的一个小程序(C语言),希望对大家有帮助 (因编译器对C标准库函数的支持不好,故没调用;函数参数中日期均为BCD码格式):
首先写一个辅助子函数
//此函数返回从当年的1月1日到参数所指日期之间的天数
ulong get_same_year_day(uchar theyear,uchar themonth,uchar theday)
{
ulong sum,leap;
switch(themonth)
{
case 1: sum=0;break;
case 2: sum=31;break;
case 3: sum=59;break;
case 4: sum=90;break;
case 5: sum=120;break;
case 6: sum=151;break;
case 7: sum=181;break;
case 8: sum=212;break;
case 9: sum=243;break;
case 10: sum=273;break;
case 11: sum=304;break;
case 12: sum=334;break;
}
sum=sum+theday;
if(theyear%400==0 ||(theyear%4==0 && theyear%100!=0))
leap=1;
else
leap=0;
if(leap==1 && themonth>2)
sum++;
return sum;
}
//将长度为len的BCD码的数据src转换成unsigned long类型并返回;
ulong bcd_to_ulong(uchar *src,uchar len)
{
uchar m,n,tmp;
ulong temp,target,temp1;
target=0;
for(m=0;m<len;m++)
{
temp=1;
for(n=1;n<2*(len-m);n++)
{
temp*=10;
}
tmp=((src[m])>>4);
target+=(tmp*temp);
tmp=((src[m])&0x0f);
target+=(tmp*temp/10);
}
temp1=target;
return target;
}
进入正题,主函数如下(所计算天数包含起始结束日期)
//返回两个日期之间相隔的天数(包含起始结束日期)
ulong get_day_num(uchar *start_date,uchar *end_date)
{
//思路一借用标准库中函数-不成功
/*
struct tm tm_start, tm_end;
time_t t_start, t_end;
uchar buf[30],key;
tm_start.tm_year=2007;
tm_start.tm_mon=11;
tm_start.tm_mday=10;
tm_start.tm_hour=0;
tm_start.tm_min=0;
tm_start.tm_sec=1;
tm_start.tm_isdst=0;
tm_end.tm_year=2007;
tm_end.tm_mon=11;
tm_end.tm_mday=11;
tm_end.tm_hour=0;
tm_end.tm_min=0;
tm_end.tm_sec=1;
tm_end.tm_isdst=0;
t_start = mktime(&tm_start) ;
t_end = mktime(&tm_end) ;
//sprintf(buf,"difftime %ld s",difftime(t_end,t_start)) ;
return difftime(t_end,t_start);
*/
ulong start_year,start_month,start_day,end_year,end_month,end_day,i;
ulong daysum=0;//相隔的总天数
start_year=bcd_to_ulong(start_date, 2);
start_month=bcd_to_ulong(start_date+2, 1);
start_day=bcd_to_ulong(start_date+3, 1);
end_year=bcd_to_ulong(end_date, 2);
end_month=bcd_to_ulong(end_date+2, 1);
end_day=bcd_to_ulong(end_date+3,1);
daysum=get_same_year_day(end_year,end_month,end_day);
for(i=start_year;i<end_year;i++)
{
if(i%400==0||(i%4==0&&i%100!=0))
{
daysum+=366;
}
else
{
daysum+=365;
}
}
daysum=daysum-get_same_year_day(start_year,start_month,start_day)+1;
return daysum;
}