平方X 发表于 2017-9-30 12:09:48

dos 计算时间差的方法总结



转自(http://conducer.blog.51cto.com/841262/1377650)
在网上搜了几篇,都写得很乱。读到这一篇的时候,写得非常好,非常感谢。
>原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://conducer.blog.51cto.com/841262/1377650

加1减100的方法非常巧妙,印象深刻。
最后根据文章方法,
[所运用到的项目](https://github.com/pingfangx/PythonX/blob/feature-android_source_downloader/ToolsX/android/android_source_downloader.py)
[生成的 bat 文件](https://github.com/pingfangx/PythonX/blob/feature-android_source_downloader/ToolsX/android/data/timex.bat)
# 原文全部粘贴如下:

有些时候我们需要计算某些程序或任务执行完毕所耗费的时间,这就需要对时间进行计算,虽然计算时间的代码有N多种,但这里主要是想和大家分享一下用批处理来计算时间差的方法。
* 目标:以时、分、秒的形式显示所耗费的时间(不包括日期计算,即不超过24小时)。
* 思路:获取开始时间和结束时间,然后计算时间差。
* 方法:①退位加减法;②总数加减法
* 难点:①如何获取时、分、秒;②如何避开小数点和08、09
* 技巧:①用for变量循环法取数;②用变量扩展法取数;③用if判断0开头的数字;④用set /a 去掉0开头的数字

# 一、获取时间的方法:
   用time变量即可轻松获取任意时点的时间,如
```
@echo off
set a=%time%
echo.
echo 开始时间:%a%
ping -n 4 127.0.0.1
set b=%time%
echo.
echo 结束时间:%b%
echo.
pause
```

# 二、获取时、分、秒的方法:
   通过time变量获取的时间格式是 hour:minite:second,如 20:02:09.07
## 1、for变量循环截取法
```
@echo off
set a=%time%
for /f "tokens=1-3 delims=:" %%i in ('echo %a%') do (
set h1=%%i
set m1=%%j
set s1=%%k
)
echo 当前时间是:%h1%时%m1%分%s1%秒
pause
```
以上脚本执行的结果是这样的形式:20时02分09.07秒,可见,秒的数是带有小数点的,在后面如果用set /a 命令去计算就会出错,这时也可以再用一次for命令去取小数点的前两位,但这样脚本会显得很累赘,因此我们可以用更简洁的变量扩展法来取数。

## 2、变量扩展偏移截取法
   批处理里有变量扩展的命令可用于截取变量中指定位置的字符。
   截取功能统一语法格式为:%a:~]%
   方括号表示可选,%为变量标识符,a为变量名,冒号用于分隔变量名和说明部分,波浪号~可理解为“偏移”,m为偏移量(缺省为0),n为截取长度(缺省为全部)。
   例如 set var=%a:~1,2% 表示把变量a的值从第2位(偏移量1)开始,把2个字符赋予给变量var。
   那么,我们获取时、分、秒数值的脚本如下:
```
@echo off
set a=%time%
set h1=%a:~0,2%
set m1=%a:~3,2%
set s1=%a:~6,2%
echo 当前时间是:%h1%时%m1%分%s1%秒
pause
```
以上脚本执行的结果是这样的形式:20时02分09秒,这时,秒的数值已经没有小数点了,但分和秒的数值高位都是以0开头,如果用set /a 命令去计算还是会出错,为此我们可以再用一次截取命令去判断这个位置的数值是否是0。脚本如下:
```
if "%m1:~0,1%"=="0" set m1=%m1:~1,1%
if "%s1:~0,1%"=="0" set s1=%s1:~1,1%
```
其实我们可以在窃取变量的时候直接用set /a 命令来获取数值,这样更省事,对于以0开头的数字,我们在百位添加一个1给它,然后再减去100即可。脚本如下:
```
@echo off
set a=%time%
set /a h1=%a:~0,2%
set /a m1=1%a:~3,2%-100
set /a s1=1%a:~6,2%-100
echo 当前时间是:%h1%时%m1%分%s1%秒
pause
```
   以上脚本执行的结果是这样的形式:20时2分9秒,这样,时、分、秒上的数字就可以直接参与计算了,用同样的方法我们可以获取结束时间:%h2%时%m2%分%s2%秒。

# 三、计算时间差的方法
## 1、退位加减法
   所谓退位加减法就是以分、秒60进制,小时24进制,当被减数不够用时从高位借1来进行计算的方法。这种计算方法与我们用笔来算的方法相同,脚本代码如下:
```
:: 计算秒数
if %s2% lss %s1% (
set /a m2=%m2%-1
set /a s2=%s2%+60
)
set /a s=%s2%-%s1%
:: 计算分钟数
if %m2% lss %m1% (
set /a h2=%h2%-1
set /a m2=%m2%+60
)
set /a m=%m2%-%m1%
:: 计算小时数
if %h2% lss %h1% (
set /a h2=%h2%+24
)
set /a h=%h2%-%h1%
echo.
echo 耗时是:%h%小时%m%分%s%秒
pause
```

## 2、总数加减法
所谓总数加减法就是先分别计算开始时间和结束时间的总秒数,然后计算两者相差的秒数,再把相差的秒数换算为时、分、秒的形式。脚本代码如下:
```
if %h2% LSS %h1% set /a h2=%h2%+24
set /a ts1=%h1%*3600+%m1%*60+%s1%
set /a ts2=%h2%*3600+%m2%*60+%s2%
set /a ts=%ts2%-%ts1%
set /a h=%ts%/3600
set /a m=(%ts%-%h%*3600)/60
set /a s=%ts%%%60
echo 耗时是:%h%小时%m%分%s%秒
pause
```
# 四、实例
   下面给出两种计算时间差的完整例子,以供参考:

## 方法一:退位加减法
```
@echo off
set time_begin=%time:~0,-3%
echo 开始时间:%time_begin%
for /f "tokens=1,2,3 delims=:" %%i in ("%time_begin%") do (
set /a hour_b=%%i
set /a munite_b=1%%j-100
set /a second_b=1%%k-100
)
ping -n 4 127.0.0.1
set time_end=%time:~0,-3%
echo 结束时间是:%time_end%
for /f "tokens=1,2,3 delims=:" %%i in ("%time_end%") do (
set /a hour_e=%%i
set /a munite_e=1%%j-100
set /a second_e=1%%k-100
)
call :time_lapse
echo.
echo 耗时%hour_%小时%munite_%分%second_%秒
pause >nul
exit
:time_lapse
:: 一定要按照 秒=>分钟=>小时 的顺序操作
:: 计算秒数
if %second_e% lss %second_b% (
set /a munite_e=%munite_e%-1
set /a second_e=%second_e%+60
)
set /a second_=%second_e%-%second_b%
:: 计算分钟数
if %munite_e% lss %munite_b% (
set /a hour_e=%hour_e%-1
set /a munite_e=%munite_e%+60
)
set /a munite_=%munite_e%-%munite_b%
:: 计算小时数
if %hour_e% lss %hour_b% (
set /a hour_e=%hour_e%+24
)
set /a hour_=%hour_e%-%hour_b%
goto :eof
```

## 方法二:总数加减法
```
@echo off
set a=%time%
echo.
echo 开始时间:%a%
ping -n 4 127.0.0.1
set b=%time%
echo.
echo 结束时间:%b%
echo.
set /a h1=%a:~0,2%
set /a m1=1%a:~3,2%-100
set /a s1=1%a:~6,2%-100
set /a h2=%b:~0,2%
set /a m2=1%b:~3,2%-100
set /a s2=1%b:~6,2%-100
if %h2% LSS %h1% set /a h2=%h2%+24
set /a ts1=%h1%*3600+%m1%*60+%s1%
set /a ts2=%h2%*3600+%m2%*60+%s2%
set /a ts=%ts2%-%ts1%
set /a h=%ts%/3600
set /a m=(%ts%-%h%*3600)/60
set /a s=%ts%%%60
echo 耗时%h%小时%m%分%s%秒
pause >nul
exit
```
>本文出自 “舟舟电脑工作室” 博客,请务必保留此出处http://conducer.blog.51cto.com/841262/1377650


页: [1]
查看完整版本: dos 计算时间差的方法总结