以前曾写过一篇文章C51计算时间差,采用的算法是网上查到的,虽然测试没有问题,但是感觉那种算法不便于理解。最近重新考虑了一种算法。
用2个BCD码数组存储进场时间和出场时间:
unsigned char idata in[5] = {0x08,0x07,0x14,0x20,0x15};//2008年7时15分
unsigned char idata out[5] = {0x11,0x07,0x15,0x08,0x14};//2011年7月15日8时14分
算法如下:
1、 首先把2个数组的BCD码转成HEX码
2、 如果进场时间的年比出场时间的年小,以进场时间2008-07-14为例,先计算从2008-07-14到2008-12-31(包含2008-12-31)有多少天,然后加上2009,2010年整年的天数。最后加上从2011-01-01到2011-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条评论)
登录后参与讨论