如何使用批处理bat计算两个时间差
本篇内容主要讲解“如何使用批处理bat计算两个时间差”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用批处理bat计算两个时间差”吧!
这个是脚本代码[保存为etime.bat放在当前路径下即可:
代码如下:
:etime <begin_time> <end_time> <return>rem 所测试任务的执行时间不超过1天 // 骨瘦如柴版 setlocal&set be=%~1:%~2&set cc=(%%d-%%a)*360000+(1%%e-1%%b)*6000+1%%f-1%%c&set dy=-8640000for /f "delims=: tokens=1-6" %%a in ("%be:.=%")do endlocal&set/a %3=%cc%,%3+=%dy%*("%3>>31")&exit/b
计算两个时间点差的函数批处理etime
今天兴趣大法思考了好多bat的问题,以至于通宵在论坛逛看到有个求时间差的"函数"被打搅调用地方不少(大都是测试代码执行效率的)
代码如下:
:time0::计算时间差(封装)@echo off&setlocal&set /a n=0&rem code 随风 @bbs.bathome.cnfor /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100)set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"endlocal&set %~3=%ok:-=%&goto :EOF
这个代码的算法是统一找时间点凌晨0:00:00.00然后计算任何一个时间点到凌晨的时间差(单位跑秒)然后任意两个时间点求时间差就是他们相对凌晨时间点的时间数的差对09这样的非法8进制数的处理用到了一些技巧,还有两个时间参数不分先后顺序,可全可点,但是这个代码一行是可以省去的(既然是常被人掉用自然体积越小越好):
代码如下:
@echo off&setlocal&set/a n=0&set "s=+:%~1^&echo -:%~2"for /f "tokens=1-5 delims=.:" %%a in ('echo %s%') do (rem code 随风 @bbs.bathome.cnset/a n%%a=10%%b%%100*360000+10%%c%%100*6000+10%%d%%100*100+10%%e%%100)set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"endlocal&(if %3. equ . (echo %ok:-=%) else set %~3=%ok:-=%)&exit/b
再研究下,有更简短的版本这个代码是我在cn-dos写过的,今天再优化了下更简短代码的算法深入一层:用hmsw(各字母代表一个两位数字)表示标准时间我们记他到凌晨的相对时间数为TxTx=hmsw时间点-0:00:00.00时间点=h*3600*100+m*60*100+100*s+whmsw 8位10进制数表示的时间数(单位0.01秒)就是hmsw跑秒hmsw=w+100*s+10000*m+1000000*hhmsw-Tx=640000*h+4000*m所以Tx=hmsw-(640000*h+4000*m)=hmsw-4000*(160*h+m)那么Tx_2-Tx_1=hmsw_2-hmsw_1-4000*(160*(h_2-h_1)+(m_2-m_1)) 对与09这样的非法8进制数我们给他们每个前面加上1就可以保证是十进制数又能保证差值不变对于非同一天的时间(这种情况较少,除非你在接近0晨时调用)我们把用8640000-去替换负号再用set/a赋值就是下面代码用到的算法Tx_2-Tx_1=hmsw_2-hmsw_1-4000*(160*(1h_2-1h_1)+(1m_2-1m_1))
代码如下:
rem 兼容时间点跨天的情行,时间格式00:00:00.00 或者 0:00:00.00 皆可:_difftime <Begin_Time> <End_Time> [ret] //返回两个时间点的差值(单位0.01秒)Setlocal enabledelayedexpansion&set b=0%1&set e=0%2&set c=1!e:~-11!-1!b:~-11!&set c=!c::=!set/a c=%c:.=%-4000*(160*(1%e:~-11,-9%-1%b:~-11,-9%)+1%e:~-8,-6%-1%b:~-8,-6%)endlocal & (if %3.==. (echo %c:-=8640000-%) else set/a %3=%c:-=8640000-%)&exit/b
给difftime前面加上_是为了表明不是临时写的子过程也为了以后连接库函数标签的唯一性
// 题外话:对于子过程,若启用了变量延迟,原则上三行都可以写完,尽量写紧凑些(因为没人读),但是对于算法,思路性的东西要能舍得笔墨,越详细越好,我发现即使你的代码写得再好,不会有人全搬,都会小修改,你自己初写代码时不可能考虑到所有人使用的具体情况,自然没人愿意很详细看你的代码,倒是你的思路为别人提供了一个方法,在此意义上函数库的作用起到方法库的作用
到此,相信大家对“如何使用批处理bat计算两个时间差”有了更深的了解,不妨来实际操作一番吧!这里是恰卡编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
推荐阅读
-
如何使用bat批处理修改日期
这篇文章主要讲解了“如何使用bat批处理修改日期”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一...
-
怎么用bat生成vbs通过注册表禁用或启用USB端口的代码
这篇文章主要介绍“怎么用bat生成vbs通过注册表禁用或启用USB端口的代码”,在日常操作中,相信很多人在怎么用bat生成vbs通...
-
如何用批处理bat根据星期启动程序
这篇文章主要介绍“如何用批处理bat根据星期启动程序”,在日常操作中,相信很多人在如何用批处理bat根据星期启动程序问题上存在疑惑...
-
如何使用BAT批处理和VBScript批量安装字体脚本
这篇文章主要介绍“如何使用BAT批处理和VBScript批量安装字体脚本”,在日常操作中,相信很多人在如何使用BAT批处理和VBS...
-
如何使用bat打开多个cmd窗口执行gulp、node
这篇文章主要为大家展示了“如何使用bat打开多个cmd窗口执行gulp、node”,内容简而易懂,条理清晰,希望能够帮助大家解决疑...
-
如何使用windows bat脚本命令一键启动MySQL服务
这篇文章主要介绍如何使用windowsbat脚本命令一键启动MySQL服务,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙...
-
批处理文件bat脚本如何实现代码自动提交和项目部署
这篇文章给大家分享的是有关批处理文件bat脚本如何实现代码自动提交和项目部署的内容。小编觉得挺实用的,因此分享给大家做个参考,一起...
-
如何使bat批处理以管理员权限运行
这篇文章给大家分享的是有关如何使bat批处理以管理员权限运行的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看...