You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批处理脚本中计算自定义格式时间戳的跨天时间差

批处理脚本计算自定义时间戳的时间差解决方案

修改后的完整脚本

@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 11:35:33