原创 C语言计算时间差

2011-9-14 17:30 3108 7 7 分类: MCU/ 嵌入式

以前曾写过一篇文章C51计算时间差,采用的算法是网上查到的,虽然测试没有问题,但是感觉那种算法不便于理解。最近重新考虑了一种算法。

2BCD码数组存储进场时间和出场时间:

unsigned char idata in[5] = {0x08,0x07,0x14,0x20,0x15};//2008715

unsigned char idata out[5] = {0x11,0x07,0x15,0x08,0x14};//2011715814

算法如下:

1、  首先把2个数组的BCD码转成HEX

2、  如果进场时间的年比出场时间的年小,以进场时间2008-07-14为例,先计算从2008-07-142008-12-31(包含2008-12-31)有多少天,然后加上20092010年整年的天数。最后加上从2011-01-012011-07-15的天数,这样就得到了进出场时间之间的天数。

3、  如果进场时间的年和出场时间的年相同,以进场时间2011-6-8,出场时间2011-9-5为例,先计算6月份还剩多少天,然后加上7,8月的天数,最后加上9月份的5天,就得到了进出场时间之间的天数。

我觉得这种算法好理解,而且程序实现起来也不难。实际测试结果是正确的。下面是程序。

 

 

/*********************************************************

计算车在场内停留的时间,单位分钟

能计算的最长停留时间是65535/24*60=45.5

**********************************************************/

unsigned int difftime(unsigned char *in_time,unsigned char *out_time)

{

       unsigned int days,result;

       uint32 temp1,temp2;

       char leap,temp_year,temp,temp_hour,temp_month,i;

       unsigned char  monthday[2][12] = {

              {31,28,31,30,31,30,31,31,30,31,30,31},//平年每月天数

              {31,29,31,30,31,30,31,31,30,31,30,31} //闰年每月天数

       };

       unsigned char in_hextime[5],out_hextime[5];

 

       temp1 = in_time[1]; //

       temp1<<=8;

       temp1 |= in_time[2];//

     temp1<<=8;

     temp1 |= in_time[3];//

     temp1<<=8;

     temp1 |= in_time[4];//

  

     temp2 =out_time[1]; //

       temp2<<=8;

       temp2 |= out_time[2];//

     temp2<<=8;

     temp2 |= out_time[3];//

     temp2<<=8;

     temp2 |= out_time[4];//

    

       if((in_time[0]>out_time[0])||(in_time[0]==out_time[0]&&temp1>=temp2))

       {

              result=0;                //进场时间>=出场时间,返回0

              return result;

       }

      

       Bcd_to_Hex(in_time,in_hextime,5);

       Bcd_to_Hex(out_time,out_hextime,5);

 

       if(in_hextime[0]<out_hextime[0])

       {

              temp_year=in_hextime[0];

              temp_month=in_hextime[1];

              leap=leapyear(in_hextime[0]);

              days=monthday[leap][temp_month-1]-in_hextime[2]+1;

              if(temp_month<12)

              {

                     while(temp_month++<12)

                     {

                            days+=monthday[leap][temp_month-1];

                     }

              }

              if(temp_month>=12)

              {temp_month=1;

              temp_year++;}

              while(temp_year<out_hextime[0])

              {

                     if(leapyear(temp_year))

                            days += 366;

                     else

                            days += 365;

                     temp_year++;

              }

              leap=leapyear(out_hextime[0]);

              for(i=0;i<(out_hextime[1]-1);i++)

              {

                     days+=monthday[leap];

              }

              days=days+out_hextime[2]-1;

       }

       else if(in_hextime[0]==out_hextime[0])

       {

              temp_month=in_hextime[1];

              leap=leapyear(in_hextime[0]);

              if(temp_month<out_hextime[1])

              {    

                     days=monthday[leap][temp_month-1]-in_hextime[2]+1;

                     while(++temp_month<out_hextime[1])

                     {

                            days+=monthday[leap][temp_month-1];

                     }

                     days=days+out_hextime[2]-1;

              }

              else

              {

                     days=out_hextime[2]-in_hextime[2];

              }

       }

        

       temp = out_hextime[4];       //暂存出场时间的分钟

       temp_hour = out_hextime[3];  //暂存出场时间的小时

       if(temp < in_hextime[4])

       {

              temp += 60;

              temp_hour -= 1;

       }

      

       result = days * 24 * 60 + (temp_hour - in_hextime[3]) *60 + temp - in_hextime[4];

      

       return result;

}

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /2 下一条