给ai一个思路就行了。开始问的是计算6秒后的时间,后来我觉得应该考虑代码执行消耗时间,及时间精度,改了下需求。
问:我需要实时获取时间,a=%time%,中间加一个timeout 6,然后获取下一个时间B=%time%,然后计算时间差 单位为厘秒
答:这是一个非常实用的需求。在批处理(Batch)中,由于 %TIME% 变量在凌晨 10 点前会包含一个前导空格(例如 9:30:05.10),如果不处理空格,字符串截取就会位移导致计算报错。
下面的脚本专门处理了空格替换、进制转换以及跨分钟/小时的逻辑。
批处理脚本代码
- @echo off
- setlocal enabledelayedexpansion
- :: 1. 获取第一个时间 A
- set "timeA=%time%"
- echo 开始时间 (A): %timeA%
- :: 2. 等待 6 秒 (实际上 timeout 6 会由于系统调度产生微小偏差)
- timeout /t 6 >nul
- :: 3. 获取第二个时间 B
- set "timeB=%time%"
- echo 结束时间 (B): %timeB%
- :: --- 开始计算时间 A 的总厘秒数 ---
- :: 将空格替换为 0,防止 10 点前截取位置错误
- set "t1=%timeA: =0%"
- set /a "h1=11%t1:~0,2% %% 100"
- set /a "m1=11%t1:~3,2% %% 100"
- set /a "s1=11%t1:~6,2% %% 100"
- set /a "c1=11%t1:~9,2% %% 100"
- set /a "total_A=(h1*360000) + (m1*6000) + (s1*100) + c1"
- :: --- 开始计算时间 B 的总厘秒数 ---
- set "t2=%timeB: =0%"
- set /a "h2=11%t2:~0,2% %% 100"
- set /a "m2=11%t2:~3,2% %% 100"
- set /a "s2=11%t2:~6,2% %% 100"
- set /a "c2=11%t2:~9,2% %% 100"
- set /a "total_B=(h2*360000) + (m2*6000) + (s2*100) + c2"
- :: --- 计算差值 ---
- set /a "diff=total_B - total_A"
- :: 如果跨天(比如从 23:59 运行到 00:01),修正差值
- if %diff% lss 0 set /a "diff+=8640000"
- echo.
- echo ----------------------------------
- echo 时间差为: %diff% 厘秒
- echo ----------------------------------
- pause
复制代码
关键点拨:
空格补位 (: =0):
%timeA: =0% 的意思是:如果时间的第一位是空格(凌晨 0-9 点),它会被替换为 0。这样 ~0,2 永远能准确定位到小时,~9,2 永远能定位到厘秒。
timeout 6 的精度:
需要注意,timeout 命令的精度并不是绝对完美的,它会有几十毫秒的系统启动开销。如果你运行结果是 605 厘秒或 598 厘秒,这是正常的系统延迟。
进制陷阱防范:
通过 11%t1:~0,2% %% 100 这种写法,彻底规避了 08 和 09 在批处理中被当做无效八进制数的问题。
跨天逻辑:
if %diff% lss 0 保证了即使你在午夜 12 点跨过的那一刻运行脚本,结果依然是正数。 |