FatalBulletHit

Duration calculator

Feb 9th, 2018 (edited)
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Batch 6.29 KB | None | 0 0
  1. @ECHO OFF
  2. SETLOCAL EnableDelayedExpansion
  3. GOTO skip_comment
  4.  
  5. ::****************************************************************************************************
  6. ::
  7.  
  8. REM This script calculates the difference between start and end time.
  9. REM
  10. REM The output can be easily adjusted, default is:
  11. REM yyyy year(s) ddd day(s) HH:mm:ss.fff (e.g: 1 year 7 days 19:07:23.573)
  12. REM
  13. REM Leap years are taken into account, but years and days are only displayed if any.
  14.  
  15. ::
  16. ::****************************************************************************************************
  17. ::
  18.  
  19. REM Usage examples
  20.  
  21. REM Calling "duration.bat":
  22.  
  23.     REM Start time
  24.     FOR /F "skip=1" %%A IN ('WMIC OS GET LOCALDATETIME') DO (SET "start=%%A" & GOTO break_1)
  25.     :break_1
  26.  
  27.     REM Code
  28.  
  29.     REM End time
  30.     FOR /F "skip=1" %%B IN ('WMIC OS GET LOCALDATETIME') DO (SET "end=%%B" & GOTO break_2)
  31.     :break_2
  32.     CALL duration.bat %start% %end%
  33.  
  34.    
  35. REM Calling subroutine ":duration"
  36.  
  37.     REM Start time
  38.     FOR /F "skip=1" %%A IN ('WMIC OS GET LOCALDATETIME') DO (SET "start=%%A" & GOTO break_1)
  39.     :break_1
  40.  
  41.     REM Code
  42.  
  43.     REM End time
  44.     FOR /F "skip=1" %%B IN ('WMIC OS GET LOCALDATETIME') DO (SET "end=%%B" & GOTO break_2)
  45.     :break_2
  46.     CALL :duration
  47.  
  48.  
  49. REM User input (variant 1):
  50.  
  51.     REM Start time
  52.     ECHO Enter start time! Format: yyyyMMddHHmmss.fff (e.g. '20180226135305.696' for '26/02/2018 13:53:05.696')
  53.     SET "start=20180226135305.696" & SET /P "start=Enter start time: "
  54.  
  55.     REM End time
  56.     ECHO Enter end time! Format: yyyyMMddHHmmss.fff (e.g. '99991231235959.999' for '31/12/9999 23:59:59.999')
  57.     SET "end=99991231235959.999" & SET /P "end=Enter end time: "
  58.  
  59.  
  60. REM User input (variant 2):
  61.  
  62.     REM Start time
  63.     SET "y_s=0000" & SET /P "y_s=Enter start year (4 digits): "
  64.     SET "z_s=01" & SET /P "z_s=Enter start month (2 digits): "
  65.     SET "d_s=01" & SET /P "d_s=Enter start day (2 digits): "
  66.     SET "h_s=00" & SET /P "h_s=Enter start hour (2 digits): "
  67.     SET "m_s=00" & SET /P "m_s=Enter start minute (2 digits): "
  68.     SET "s_s=00" & SET /P "s_s=Enter start second (2 digits): "
  69.     SET "ms_s=000" & SET /P "ms_s=Enter start millisecond (3 digits): "
  70.     SET "start=%y_s%%z_s%%d_s%%h_s%%m_s%%s_s%.%ms_s%" & CLS
  71.  
  72.     REM end time
  73.     SET "y_e=2018" & SET /P "y_e=Enter end year (4 digits): "
  74.     SET "z_e=02" & SET /P "z_e=Enter end month (2 digits): "
  75.     SET "d_e=26" & SET /P "d_e=Enter end day (2 digits): "
  76.     SET "h_e=13" & SET /P "h_e=Enter end hour (2 digits): "
  77.     SET "m_e=53" & SET /P "m_e=Enter end minute (2 digits): "
  78.     SET "s_e=05" & SET /P "s_e=Enter end second (2 digits): "
  79.     SET "ms_e=696" & SET /P "ms_e=Enter end millisecond (3 digits): "
  80.     SET "end=%y_e%%z_e%%d_e%%h_e%%m_e%%s_e%.%ms_e%" & CLS
  81.  
  82.  
  83. REM Manual input:
  84.  
  85.     REM Start time
  86.     SET "start=20180226135305.696"
  87.  
  88.     REM End time
  89.     SET "end=99991231235959.999"
  90.  
  91. ::
  92. ::****************************************************************************************************
  93. ::
  94.  
  95. REM You can also adjust and combine the usage examples.
  96.  
  97. ::
  98. ::****************************************************************************************************
  99. :skip_comment
  100.  
  101.  
  102.  
  103.  
  104.  
  105. :duration
  106. REM Checking for errors and setting up variables, start and end time (z is month)
  107. 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)))
  108. 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!"
  109. 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!"
  110. 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!"
  111.  
  112. REM Removing zeroes to prevent errors with SET /A
  113. FOR %%W IN (y_s y_e) DO (IF "!%%W!"=="0000" (SET "%%W=0") ELSE (
  114.     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!")))))
  115. 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=!"))
  116. FOR %%U IN (ms_s ms_e) DO (IF "!%%U!"=="000" (SET "%%U=0") ELSE (
  117.     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!"))))
  118.  
  119. REM Converting months to days and checking for leap years
  120. 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")
  121. 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")))))
  122.  
  123. REM Converting days, hours and minutes to seconds and calculating years and milliseconds
  124. 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!"
  125. 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")
  126. SET /A "ms=!ms_e!-!ms_s!" & IF !ms! LSS 0 (SET /A "ms=1000+!ms!" & SET /A "dur-=1")
  127.  
  128. REM Checking for errors
  129. 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)
  130.  
  131. REM Converting duration to days, hours and minutes
  132. SET /A "d=!dur!/86400" & SET /A "h=!dur!%%86400/3600" & SET /A "m=!dur!%%3600/60" & SET /A "s=!dur!%%60"
  133.  
  134. REM Adding year(s) and day(s) if any
  135. IF !y!==0 (SET "y=") ELSE ((IF !y! GTR 1 SET "ply=s") & SET "y=!y! year!ply! ")
  136. IF !d!==0 (SET "d=") ELSE ((IF !d! GTR 1 SET "pld=s") & SET "d=!d! day!pld! ")
  137.  
  138. REM Adding zero in front if output is a single digit
  139. 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!")
  140.  
  141. REM Displaying start and end time and duration and terminating the subroutine
  142. 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