计算任意俩日期之间的天数

开发工作中写的一个小程序(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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值