批处理脚本中计算自定义格式时间戳的跨天时间差
批处理脚本计算自定义时间戳的时间差解决方案
修改后的完整脚本
@Echo Off Cls SetLocal EnableDelayedExpansion EnableExtensions REM 获取开始时间 Call :DATETIME Set StartDT=!DateTime! Echo. Echo !StartDT!^|Info^|Process started... REM DO STUFF Ping -n 8 localhost>Nul 2>Nul REM FINISH DOING STUFF REM 获取结束时间 Call :DATETIME Set EndDT=!DateTime! Echo. Echo !EndDT!^|Info^|Process complete. REM 计算时间差 Call :TO_SECONDS "!StartDT!" StartSec Call :TO_SECONDS "!EndDT!" EndSec Set /A DiffSec=EndSec - StartSec REM 格式化时长 Call :FORMAT_DURATION !DiffSec! DurationStr Echo. Echo Run time was !DurationStr!. EndLocal Exit /B REM 生成自定义格式时间戳 :DATETIME For /F "Tokens=* Delims=" %%A In ('WMIC OS Get LocalDateTime ^|Find "."') Do @Set DT=%%A Set Year=!DT:~0,4! Set Month=!DT:~4,2! Set Day=!DT:~6,2! Set Hour=!DT:~8,2! Set Minute=!DT:~10,2! Set Second=!DT:~12,2! Set DateTime=!Year!!Month!!Day!.!Hour!!Minute!!Second! Goto :EOF REM 将YYYYMMDD.HHMMSS转换为Unix时间戳(总秒数) :TO_SECONDS Set "DTStr=%~1" Set "DatePart=!DTStr:~0,8!" Set "TimePart=!DTStr:~9,6!" Set "TimeFormatted=!TimePart:~0,2!:!TimePart:~2,2!:!TimePart:~4,2!" For /F %%S In ('powershell -Command "(Get-Date -Date '!DatePart! !TimeFormatted!').ToFileTimeUtc() / 10000000 - 11644473600"') Do Set "%~2=%%S" Goto :EOF REM 将总秒数格式化为天/时/分/秒的可读字符串 :FORMAT_DURATION Set "TotalSec=%~1" Set "DurationStr=" Set /A Days=TotalSec / 86400 Set /A Remain=TotalSec %% 86400 If !Days! GTR 0 ( Set "DurationStr=!Days!天" ) Set /A Hours=Remain / 3600 Set /A Remain=Remain %% 3600 If !Hours! GTR 0 ( If Defined DurationStr Set "DurationStr=!DurationStr! " Set "DurationStr=!DurationStr!!Hours!小时" ) Set /A Minutes=Remain / 60 Set /A Seconds=Remain %% 60 If !Minutes! GTR 0 ( If Defined DurationStr Set "DurationStr=!DurationStr! " Set "DurationStr=!DurationStr!!Minutes!分钟" ) If !Seconds! GTR 0 Or Not Defined DurationStr ( If Defined DurationStr Set "DurationStr=!DurationStr! " Set "DurationStr=!DurationStr!!Seconds!秒" ) Set "%~2=!DurationStr!" Goto :EOF
关键实现说明
- 保存时间戳:调用
:DATETIME后,将结果分别存入StartDT和EndDT变量,作为计算时间差的原始数据。 - 转换为总秒数:通过
:TO_SECONDS子函数调用PowerShell,把自定义格式的时间戳转成Unix时间戳(从1970年1月1日到目标时间的总秒数),跨天的时间差只需做整数减法即可完成计算。 - 格式化时长:
:FORMAT_DURATION子函数将总秒数拆解为天、小时、分钟、秒,仅保留非零的时间单位,输出简洁的可读字符串。
注意事项
该脚本依赖Windows自带的PowerShell,无需额外安装组件,兼容性良好。如果需要纯批处理实现(不依赖PowerShell),需自行处理闰年、各月份天数等复杂逻辑,代码量会大幅增加。
内容的提问来源于stack exchange,提问作者user3208239
相关产品推荐
相关产品推荐

