完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
以前曾写过一篇文章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] { 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 { 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 { days=monthday[leap][temp_month-1]-in_hextime[2]+1; while(++temp_month { 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; } |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
3103 浏览 3 评论
1553 浏览 3 评论
4706 浏览 1 评论
2044 浏览 1 评论
3298 浏览 2 评论
538浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 14:30 , Processed in 0.851995 second(s), Total 62, Slave 46 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号