• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >DOS/BAT > 批处理bat计算两个时间差

批处理bat计算两个时间差

作者:mdxy-dxy 字体:[增加 减小] 来源:互联网

mdxy-dxy 通过本文主要向大家介绍了bat批处理,bat批处理文件,bat批处理教程,bat批处理命令,bat批处理命令大全等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

这个是脚本代码[保存为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=-8640000
for /f "delims=: tokens=1-6" %%a in ("%be:.=%")do endlocal&set/a %3=%cc%,%3+=%dy%*("%3>>31")&exit/b
</div>

计算两个时间点差的函数批处理etime

今天兴趣大法思考了好多bat的问题,以至于通宵
在论坛逛看到有个求时间差的"函数"被打搅调用地方不少(大都是测试代码执行效率的)

:time0
::计算时间差(封装)
@echo off&setlocal&set /a n=0&rem code 随风 @bbs.bathome.cn
for /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%%100
set /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%%100
set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
endlocal&set %~3=%ok:-=%&goto :EOF
</div>

这个代码的算法是统一找时间点凌晨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.cn
set/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%%100
set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
endlocal&(if %3. equ . (echo %ok:-=%) else set %~3=%ok:-=%)&exit/b
</div>

再研究下,有更简短的版本
这个代码是我在cn-dos写过的,今天再优化了下更简短
代码的算法深入一层:
用hmsw(各字母代表一个两位数字)表示标准时间
我们记他到凌晨的相对时间数为Tx
Tx=hmsw时间点-0:00:00.00时间点=h*3600*100+m*60*100+100*s+w
hmsw 8位10进制数表示的时间数(单位0.01秒)就是hmsw跑秒
hmsw=w+100*s+10000*m+1000000*h
hmsw-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
</div>

给difftime前面加上_是为了表明不是临时写的子过程也为了以后连接库函数标签的唯一性

// 题外话:
对于子过程,若启用了变量延迟,原则上三行都可以写完,尽量写紧凑些(因为没人读),但是对于算法,
思路性的东西要能舍得笔墨,越详细越好,我发现即使你的代码写得再好,不会有人全搬,都会小修改,
你自己初写代码时不可能考虑到所有人使用的具体情况,自然没人愿意很详细看你的代码,倒是你的思路为
别人提供了一个方法,在此意义上函数库的作用起到方法库的作用

</div>

您可能想查找下面的文章:

  • 批处理bat递归计算N!的实现代码
  • BAT批处理实现自动安装软件功能
  • BAT批处理中使用数组示例
  • 批处理脚本实现提醒下班要打卡
  • 批处理bat计算两个时间差
  • 批处理bat根据星期启动程序
  • 批处理bat判断一个文件在最近5分钟内是否被更新过的代码
  • 使用bat批处理来安装和卸载ASP组件
  • 使用BAT批处理在RAR压缩文件中批量添加文件的方法
  • 用批处理实现批量安装字体的bat文件

相关文章

  • diskcopy 命令使用说明
  • cmd批量打开网页和关闭网页的批处理代码
  • 一个不错的优化系统的批处理
  • Windows系统自动连接网络共享打印机BAT脚本分享
  • cmd批处理 goto call命令使用说明
  • dos利用wget.exe让杀毒软件升级更自动化
  • 批处理删除使用所有Windows Update功能的访问[图文+bat]
  • ARP实现本机绑定的批处理文件
  • 百度关键字搜索(批处理打开网页)
  • 使用 atmadm 来显示 ATM 适配器上传入和传出呼叫的统计信息

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • CMDOW 一个CMD命令行下 隐藏、禁用窗口控制程序
    • 可以使用的批处理参数集合
    • wmic 命令用法及实例
    • 通过批处理实现删除运行、查找等处的历史记录的代码
    • 批处理经典入门教程!(从不懂到高手)第1/5页
    • nslookup来列举二级玉米
    • 7zip在dos命令行用法总结
    • Cls 清除命令提示符窗口
    • 将字符串小写转大写并延时输出的批处理代码
    • 计算字符串的长度批处理

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有