Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @ECHO OFF
- SETLOCAL EnableDelayedExpansion
- GOTO skip_comment
- ::****************************************************************************************************
- ::
- REM This script calculates the difference between start and end time.
- REM
- REM The output can be easily adjusted, default is:
- REM yyyy year(s) ddd day(s) HH:mm:ss.fff (e.g: 1 year 7 days 19:07:23.573)
- REM
- REM Leap years are taken into account, but years and days are only displayed if any.
- ::
- ::****************************************************************************************************
- ::
- REM Usage examples
- REM Calling "duration.bat":
- REM Start time
- FOR /F "skip=1" %%A IN ('WMIC OS GET LOCALDATETIME') DO (SET "start=%%A" & GOTO break_1)
- :break_1
- REM Code
- REM End time
- FOR /F "skip=1" %%B IN ('WMIC OS GET LOCALDATETIME') DO (SET "end=%%B" & GOTO break_2)
- :break_2
- CALL duration.bat %start% %end%
- REM Calling subroutine ":duration"
- REM Start time
- FOR /F "skip=1" %%A IN ('WMIC OS GET LOCALDATETIME') DO (SET "start=%%A" & GOTO break_1)
- :break_1
- REM Code
- REM End time
- FOR /F "skip=1" %%B IN ('WMIC OS GET LOCALDATETIME') DO (SET "end=%%B" & GOTO break_2)
- :break_2
- CALL :duration
- REM User input (variant 1):
- REM Start time
- ECHO Enter start time! Format: yyyyMMddHHmmss.fff (e.g. '20180226135305.696' for '26/02/2018 13:53:05.696')
- SET "start=20180226135305.696" & SET /P "start=Enter start time: "
- REM End time
- ECHO Enter end time! Format: yyyyMMddHHmmss.fff (e.g. '99991231235959.999' for '31/12/9999 23:59:59.999')
- SET "end=99991231235959.999" & SET /P "end=Enter end time: "
- REM User input (variant 2):
- REM Start time
- SET "y_s=0000" & SET /P "y_s=Enter start year (4 digits): "
- SET "z_s=01" & SET /P "z_s=Enter start month (2 digits): "
- SET "d_s=01" & SET /P "d_s=Enter start day (2 digits): "
- SET "h_s=00" & SET /P "h_s=Enter start hour (2 digits): "
- SET "m_s=00" & SET /P "m_s=Enter start minute (2 digits): "
- SET "s_s=00" & SET /P "s_s=Enter start second (2 digits): "
- SET "ms_s=000" & SET /P "ms_s=Enter start millisecond (3 digits): "
- SET "start=%y_s%%z_s%%d_s%%h_s%%m_s%%s_s%.%ms_s%" & CLS
- REM end time
- SET "y_e=2018" & SET /P "y_e=Enter end year (4 digits): "
- SET "z_e=02" & SET /P "z_e=Enter end month (2 digits): "
- SET "d_e=26" & SET /P "d_e=Enter end day (2 digits): "
- SET "h_e=13" & SET /P "h_e=Enter end hour (2 digits): "
- SET "m_e=53" & SET /P "m_e=Enter end minute (2 digits): "
- SET "s_e=05" & SET /P "s_e=Enter end second (2 digits): "
- SET "ms_e=696" & SET /P "ms_e=Enter end millisecond (3 digits): "
- SET "end=%y_e%%z_e%%d_e%%h_e%%m_e%%s_e%.%ms_e%" & CLS
- REM Manual input:
- REM Start time
- SET "start=20180226135305.696"
- REM End time
- SET "end=99991231235959.999"
- ::
- ::****************************************************************************************************
- ::
- REM You can also adjust and combine the usage examples.
- ::
- ::****************************************************************************************************
- :skip_comment
- :duration
- REM Checking for errors and setting up variables, start and end time (z is month)
- IF NOT DEFINED start (SET "start=%1") & IF NOT DEFINED end (SET "end=%2") & FOR %%X IN (start end) DO (IF NOT DEFINED %%X (ECHO Error: No %%X time defined & PAUSE & EXIT /B) ELSE (>temp ECHO %%%X% & FOR %%Y IN (temp) DO SET /A "length=%%~zY-2" & del temp & IF NOT !length!==18 (ECHO Error: %%X time has invalid length & EXIT /B)))
- SET "y_s=!start:~0,4!" & SET "z_s=!start:~4,2!" & SET "d_s=!start:~6,2!" & SET "h_s=!start:~8,2!" & SET "m_s=!start:~10,2!" & SET "s_s=!start:~12,2!" & SET "ms_s=!start:~15,3!"
- SET "y_e=!end:~0,4!" & SET "z_e=!end:~4,2!" & SET "d_e=!end:~6,2!" & SET "h_e=!end:~8,2!" & SET "m_e=!end:~10,2!" & SET "s_e=!end:~12,2!" & SET "ms_e=!end:~15,3!"
- SET "start_time=!d_s!/!z_s!/!y_s! !h_s!:!m_s!:!s_s!.!ms_s!" & SET "end_time=!d_e!/!z_e!/!y_e! !h_e!:!m_e!:!s_e!.!ms_e!"
- REM Removing zeroes to prevent errors with SET /A
- FOR %%W IN (y_s y_e) DO (IF "!%%W!"=="0000" (SET "%%W=0") ELSE (
- SET "w_3=!%%W:~0,3!" & (IF "!w_3!"=="000" (SET "%%W=!%%W:~-1!") ELSE (SET "w_2=!%%W:~0,2!" & IF "!w_2!"=="00" (SET "%%W=!%%W:~-2!") ELSE (SET "w_1=!%%W:~0,1!" & IF "!w_1!"=="0" SET "%%W=!%%W:~-3!")))))
- FOR %%V IN (z_s z_e d_s d_e h_s h_e m_s m_e s_s s_e) DO (IF "!%%V!"=="00" (SET "%%V=0") ELSE (IF !%%V! LEQ 9 SET "%%V=!%%V:0=!"))
- FOR %%U IN (ms_s ms_e) DO (IF "!%%U!"=="000" (SET "%%U=0") ELSE (
- SET "u_2=!%%U:~0,2!" & (IF "!u_2!"=="00" (SET "%%U=!%%U:~-1!") ELSE (SET "u_1=!%%U:~0,1!" & IF "!u_1!"=="0" SET "%%U=!%%U:~-2!"))))
- REM Converting months to days and checking for leap years
- SET "days=0" & FOR %%T IN (31 28 31 30 31 30 31 31 30 31 30 31) DO (SET /A "n+=1" & (IF !z_s!==!n! SET /A "d_s+=!days!") & (IF !z_e!==!n! SET /A "d_e+=!days!") & SET /A "days+=%%T")
- FOR %%S IN (s e) DO (IF !z_%%S! GTR 2 (SET /A "a=!y_%%S!%%4" & SET /A "b=!y_%%S!%%100" & SET /A "c=!y_%%S!%%400" & (IF !a!==0 (IF NOT !b!==0 (SET /A "d_%%S+=1") ELSE (IF !c!==0 SET /A "d_%%S+=1")))))
- REM Converting days, hours and minutes to seconds and calculating years and milliseconds
- SET /A "start=!d_s!*86400+!h_s!*3600+!m_s!*60+!s_s!" & SET /A "end=!d_e!*86400+!h_e!*3600+!m_e!*60+!s_e!"
- SET /A "y=!y_e!-!y_s!" & SET /A "dur=!end!-!start!" & IF !dur! LSS 0 (SET /A "dur=31536000+!dur!" & SET /A "y-=1")
- SET /A "ms=!ms_e!-!ms_s!" & IF !ms! LSS 0 (SET /A "ms=1000+!ms!" & SET /A "dur-=1")
- REM Checking for errors
- IF !y! LSS 0 (ECHO Error: Start time before end time! & PAUSE & EXIT /B) & IF !y!==0 (IF !dur! LSS 0 ECHO Error: Start time before end time! & PAUSE & EXIT /B)
- REM Converting duration to days, hours and minutes
- SET /A "d=!dur!/86400" & SET /A "h=!dur!%%86400/3600" & SET /A "m=!dur!%%3600/60" & SET /A "s=!dur!%%60"
- REM Adding year(s) and day(s) if any
- IF !y!==0 (SET "y=") ELSE ((IF !y! GTR 1 SET "ply=s") & SET "y=!y! year!ply! ")
- IF !d!==0 (SET "d=") ELSE ((IF !d! GTR 1 SET "pld=s") & SET "d=!d! day!pld! ")
- REM Adding zero in front if output is a single digit
- IF !ms! LEQ 9 (SET "ms=00!ms!") ELSE (IF !ms! LEQ 99 (SET "ms=0!ms!")) & FOR %%R IN (h m s) DO (IF !%%R! LEQ 9 SET "%%R=0!%%R!")
- REM Displaying start and end time and duration and terminating the subroutine
- ECHO Start: !start_time! & ECHO End: !end_time! & ECHO. & ECHO Duration: !y!!d!!h!:!m!:!s!.!ms! & EXIT /B
Add Comment
Please, Sign In to add comment