Calculate time difference in Windows batch file Calculate time difference in Windows batch file windows windows

Calculate time difference in Windows batch file


@echo offrem Get start time:for /F "tokens=1-4 delims=:.," %%a in ("%time%") do (   set /A "start=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100")rem Any process here...rem Get end time:for /F "tokens=1-4 delims=:.," %%a in ("%time%") do (   set /A "end=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100")rem Get elapsed time:set /A elapsed=end-startrem Show elapsed time:set /A hh=elapsed/(60*60*100), rest=elapsed%%(60*60*100), mm=rest/(60*100), rest%%=60*100, ss=rest/100, cc=rest%%100if %mm% lss 10 set mm=0%mm%if %ss% lss 10 set ss=0%ss%if %cc% lss 10 set cc=0%cc%echo %hh%:%mm%:%ss%,%cc%

EDIT 2017-05-09: Shorter method added

I developed a shorter method to get the same result, so I couldn't resist to post it here. The two for commands used to separate time parts and the three if commands used to insert leading zeros in the result are replaced by two long arithmetic expressions, that could even be combined into a single longer line.

The method consists in directly convert a variable with a time in "HH:MM:SS.CC" format into the formula needed to convert the time to centiseconds, accordingly to the mapping scheme given below:

       HH        :      MM        :      SS        .       CC(((10  HH  %%100)*60+1  MM  %%100)*60+1  SS  %%100)*100+1  CC  %%100

That is, insert (((10 at beginning, replace the colons by %%100)*60+1, replace the point by %%100)*100+1 and insert %%100 at end; finally, evaluate the resulting string as an arithmetic expression. In the time variable there are two different substrings that needs to be replaced, so the conversion must be completed in two lines. To get an elapsed time, use (endTime)-(startTime) expression and replace both time strings in the same line.

EDIT 2017/06/14: Locale independent adjustment added

EDIT 2020/06/05: Pass-over-midnight adjustment added

@echo offsetlocal EnableDelayedExpansionset "startTime=%time: =0%"set /P "=Any process here..."set "endTime=%time: =0%"rem Get elapsed time:set "end=!endTime:%time:~8,1%=%%100)*100+1!"  &  set "start=!startTime:%time:~8,1%=%%100)*100+1!"set /A "elap=((((10!end:%time:~2,1%=%%100)*60+1!%%100)-((((10!start:%time:~2,1%=%%100)*60+1!%%100), elap-=(elap>>31)*24*60*60*100"rem Convert elapsed time to HH:MM:SS:CC format:set /A "cc=elap%%100+100,elap/=100,ss=elap%%60+100,elap/=60,mm=elap%%60+100,hh=elap/60+100"echo Start:    %startTime%echo End:      %endTime%echo Elapsed:  %hh:~1%%time:~2,1%%mm:~1%%time:~2,1%%ss:~1%%time:~8,1%%cc:~1%

You may review a detailed explanation of this method at this answer.


As answered here:How can I use a Windows batch file to measure the performance of console application?

Below batch "program" should do what you want. Please note that it outputs the data in centiseconds instead of milliseconds. The precision of the used commands is only centiseconds.

Here is an example output:

STARTTIME: 13:42:52,25ENDTIME: 13:42:56,51STARTTIME: 4937225 centisecondsENDTIME: 4937651 centisecondsDURATION: 426 in centiseconds00:00:04,26

Here is the batch script:

@echo offsetlocalrem The format of %TIME% is HH:MM:SS,CS for example 23:59:59,99set STARTTIME=%TIME%rem here begins the command you want to measuredir /s > nulrem here ends the command you want to measureset ENDTIME=%TIME%rem output as timeecho STARTTIME: %STARTTIME%echo ENDTIME: %ENDTIME%rem convert STARTTIME and ENDTIME to centisecondsset /A STARTTIME=(1%STARTTIME:~0,2%-100)*360000 + (1%STARTTIME:~3,2%-100)*6000 + (1%STARTTIME:~6,2%-100)*100 + (1%STARTTIME:~9,2%-100)set /A ENDTIME=(1%ENDTIME:~0,2%-100)*360000 + (1%ENDTIME:~3,2%-100)*6000 + (1%ENDTIME:~6,2%-100)*100 + (1%ENDTIME:~9,2%-100)rem calculating the duratyion is easyset /A DURATION=%ENDTIME%-%STARTTIME%rem we might have measured the time inbetween daysif %ENDTIME% LSS %STARTTIME% set set /A DURATION=%STARTTIME%-%ENDTIME%rem now break the centiseconds down to hors, minutes, seconds and the remaining centisecondsset /A DURATIONH=%DURATION% / 360000set /A DURATIONM=(%DURATION% - %DURATIONH%*360000) / 6000set /A DURATIONS=(%DURATION% - %DURATIONH%*360000 - %DURATIONM%*6000) / 100set /A DURATIONHS=(%DURATION% - %DURATIONH%*360000 - %DURATIONM%*6000 - %DURATIONS%*100)rem some formattingif %DURATIONH% LSS 10 set DURATIONH=0%DURATIONH%if %DURATIONM% LSS 10 set DURATIONM=0%DURATIONM%if %DURATIONS% LSS 10 set DURATIONS=0%DURATIONS%if %DURATIONHS% LSS 10 set DURATIONHS=0%DURATIONHS%rem outputingecho STARTTIME: %STARTTIME% centisecondsecho ENDTIME: %ENDTIME% centisecondsecho DURATION: %DURATION% in centisecondsecho %DURATIONH%:%DURATIONM%:%DURATIONS%,%DURATIONHS%endlocalgoto :EOF


A re-hash of Aacini's code because most likely you are going to set the start time as a variable and want to save that data for output:

    @echo off    rem ******************  MAIN CODE SECTION    set STARTTIME=%TIME%    rem Your code goes here (remove the ping line)    ping -n 4 -w 1 127.0.0.1 >NUL    set ENDTIME=%TIME%    rem ******************  END MAIN CODE SECTION    rem Change formatting for the start and end times    for /F "tokens=1-4 delims=:.," %%a in ("%STARTTIME%") do (       set /A "start=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100"    )    for /F "tokens=1-4 delims=:.," %%a in ("%ENDTIME%") do (        IF %ENDTIME% GTR %STARTTIME% set /A "end=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100"        IF %ENDTIME% LSS %STARTTIME% set /A "end=((((%%a+24)*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100"     )    rem Calculate the elapsed time by subtracting values    set /A elapsed=end-start    rem Format the results for output    set /A hh=elapsed/(60*60*100), rest=elapsed%%(60*60*100), mm=rest/(60*100), rest%%=60*100, ss=rest/100, cc=rest%%100    if %hh% lss 10 set hh=0%hh%    if %mm% lss 10 set mm=0%mm%    if %ss% lss 10 set ss=0%ss%    if %cc% lss 10 set cc=0%cc%    set DURATION=%hh%:%mm%:%ss%,%cc%    echo Start    : %STARTTIME%    echo Finish   : %ENDTIME%    echo          ---------------    echo Duration : %DURATION% 

Output:

    Start    : 11:02:45.92    Finish   : 11:02:48.98             ---------------    Duration : 00:00:03,06