精选栏目: 装机必备 专题大全 常用工具 系统集锦

批处理中的时间计算详解

栏目: 批处理 已有人学习|编辑:admin; 来源:未知;

 最近总是有人在询问涉及到时间和日期计算的问题,其实要计算时间和日期最有效的方
法是用vbs的时间函数,几行代码就解决了。但我们今天要谈的就是如何用批来计算时间和日期
(有点自找苦吃的感觉),下面就展开正题吧:

  一、系统中的date和time变量
  要进行时间和日期的计算,我们必须认识两个系统变量date和time。当你在cmd中输入ec
ho %date%#%time%再回车,屏幕上就会出现这样的一排字符:2009-08-19 星期三#10:20:10.20
,前面是表示的当前的日期-2009年8月19日星期三共14个字符(中间有个空格),后面表示的是当
前的时间10点20分10秒20毫秒共13个字符。当然在不同的系统中时间格式是不一样的,我们暂以
xp系统为例来继续后面的分析。转回正题,现在我们可以通过变量截取命令来获得想要的时间参
数。如我想要获得当前的小时和分的值并把它分别赋值给名为h和m的变量:set "h=%time:~,2%
"&set "m=%time:~3,2%",在这里要注意除了年以外所有的时间参数都是两位数的格式(年是四
位),当数值不满两位时,系统会自动在前面补上0,小时是补上空格如: 8:04:09:03,这就会给我
们的计算带来麻烦(小时中的空格不影响计算),具体的将会在后面详细说明。

  二、进制互换和去零操作
  事实上时间参数是很麻烦,其参数格式上存在着数种进制:十进制(年、毫秒)、十二进制(
月)、三十进制(天,姑且这么说)、七进制(星期)、二四进制(小时)、六十进(分秒)。大家
看是不是很麻烦,因为cmd中只能进行十进制计算,所以我们就必须先将所有的要计算的参数转化成
十进制计算后再转回相应的进制。我们前面讲到当分、秒(还有月、天)值不满两位时,系统会自动在前
面补上0,要想正确计算,我们就必须去掉前面这个0。为什么?因为在cmd中不会将08 09这样的数值
认定为是十进制数值,而cmd中一般是只能进行十进制计算的(除了位运算),所以会导致程序出错。
那么如何进行进制互换以及去零操作呢?下面我们以例示之并说明:

@echo off&setlocal enabledelayedexpansion
rem 计算当前时间往后1000秒是什么时间(不包含日期计算)
set "h=%time:~,2%"&set "m=%time:~3,2%"&set "s=%time:~6,2%"
echo 当前时间%h%:%m%:%s%
rem 上面依次截取时间变量的时、分、秒值并分别赋值给h、m、s变量
for /l %%a in (1,1,1000) do (
     set /a m=1!m!%%100,s=1!s!%%100,s+=1
     rem 上面将m、s变量去零转化为有效的10进制数值
     if !s! equ 60 set /a s=0,m+=1
     if !m! equ 60 set /a m=0,h+=1
     if !h! equ 24 set /a h=0
     rem 上面将每次递加后的时、分、秒值转化为相应的进制
)
set "m=0%m%"&set "m=!m:~-2!"
set "s=0%s%"&set "s=!s:~-2!"
rem 上面将分、秒值在前面补0并取后两位数(补足两位数)
echo 往后1000秒是%h%:%m%:%s%
pause>nul

这时,可能有人会问到上面的去零究竟是怎么实现的?其实关于这个我在《批处理实用技
术》一贴中就已经说明了,今天就再讲解一次。首先大家要认识set /a 中这个命令符"%%",它表
示取余操作,就是我们数学中所说的取被除数相对于除数的余数。如:set /a a=14%%3,b=27%%3
a b的值分别为2和0,也就是说14/3=4(2)余数是2,27/3=9(0)余数是0。那么我们现在回到时间
的计算上来,假设当前时间为7:04:08秒,我们就可以在分和秒的值前都加上1,然后对100取余,
余数不就是4和8了吗?我们还是用代码来加以说明:

@echo off
set "times= 7:04:08"&rem 在设置变量是不要与系统变量同名,所以加上了s
set /a h=%times:~,2%,m=1%times:~3,2%%%100,s=1%times:~6,2%%%100
echo %h%:%m%:%s%
pause>nul

 三、复杂的时间计算回溯和推移
  这一问题多出现对一定时间范围内的文件操作上,要确定这一时间范围就必须进行时间
的计算。首先我们来看一段代码:

@echo off&setlocal enabledelayedexpansion
rem 计算当前日期时间回溯3286小时的日期和时间
set /a y=%date:~,4%,mo=1%date:~5,2%%%100,d=1%date:~8,2%%%100,h=%time:~,2%,m=1%time:~3,2%%%100,s=1%time:~6,2%%%100
echo 当前时间为:%y%年%mo%月%d%日%h%时%m%分%s%秒
call :judge
for %%a in (1 3 5 7 8 10 12) do set "_%%a=31"
for %%a in (4 6 9 11) do set "_%%a=30"
set /a num_d=3286/24,num_h=3286%%24
for /l %%a in (1,1,%num_d%) do (
     set /a d-=1
     if !d! equ 0 call :lp
)
for /l %%a in (1,1,%num_h%) do (
     set /a h-=1
     if !h! equ 0 set /a h=24,d-=1
     if !d! equ 0 call :lp

收藏 赞() 踩()
本文地址:https://www.zhishiwu.com/bc/bat/423.html
本文标签:批处理