golfjrr Posted November 6, 2004 Posted November 6, 2004 Input two times, It gives you the elapsed time in format HH:MI:SS Note: it only works in a 24 hours period, but will work over midnight (i.e. 23:22:11 to 01:33:22) Probably easier ways to do it, but I'm an autoit newb and this works... expandcollapse popup#comments-start Elapsedtime.ai3 By: snipeye@golfc.com Autoit 3 Function to compute elapsed time Will only work within a 24 hour period but will cross midnight Parameters $Oldtime = earlier time, $NewTime = later time If NewTime < OldTime it assumes you are crossing days Format for both inputs is "HH:MI:SS" or "HHMISS" 11/05/2004 Written #comments-end ;below for testing ; ;$Oldtime = "23:01:10" ;$NewTime = "23:02:18" ;or you can omit the colons (i.e. "230110") ;$junk = ElapsedTime ($Oldtime, $NewTime) ;splashtexton ("Elapsed",$junk, 150,20) ;sleep (5000) ;splashoff () ;exit Func ElapsedTime ( $OldTime, $NewTime ) Local $OldTime,$NewTime,$DiffTime, $Ohour,$Ominute,$Osecond,$Nhour,$Nminute,$Nsecond Local $Dhour, $Dminute, $Dsecond, $Otot, $Ntot, $Diffwork, $Diffmin, $Diffsec, $Diffhour ; ;Determine how to break up time based on colon or not ; If StringInStr ($Oldtime, ":") = 0 then $Ohour = number ( stringmid ($OldTime,1,2) ) $Ominute = number ( stringmid ($OldTime,3,2) ) $Osecond = number ( stringmid ($OldTime,5,2) ) else $Ohour = number ( stringmid ($OldTime,1,2) ) $Ominute = number ( stringmid ($OldTime,4,2) ) $Osecond = number ( stringmid ($OldTime,7,2) ) endif If StringInStr ($NewTime, ":") = 0 then $Nhour = number ( stringmid ($NewTime,1,2) ) $Nminute = number ( stringmid ($NewTime,3,2) ) $Nsecond = number ( stringmid ($NewTime,5,2) ) else $Nhour = number ( stringmid ($NewTime,1,2) ) $Nminute = number ( stringmid ($NewTime,4,2) ) $Nsecond = number ( stringmid ($NewTime,7,2) ) endif If $Ohour > $Nhour then $Nhour = $Nhour + 24 ;Rolled over a day so add 24 hours ; ;Now do the math ; $Otot = ($Ohour * 60 * 60) + ($Ominute * 60 ) + $Osecond ;convert to seconds $Ntot = ($Nhour * 60 * 60) + ($Nminute * 60 ) + $Nsecond ;convert to seconds $Diffwork = $Ntot - $Otot ;This is the difference in seconds select case $Diffwork < 60 ;No hours or minutes, only seconds $Diffhour = "00" $Diffmin = "00" $Diffsec = $Diffwork ;seconds case $Diffwork < 3600 ;No hours, just minutes and seconds $DiffHour = "00" $Diffmin = Int($Diffwork/60) ;minutes $Diffsec = mod($Diffwork,60) ;seconds case else ;Hours, minutes, and seconds included $DiffHour = Int($Diffwork/3600) ;Hours $Diffwork = $Diffwork-3600 ;Subtract out hours $Diffmin = Int($Diffwork/60) ;minutes $Diffsec = mod($Diffwork,60) ;seconds endselect $DiffTime = StringFormat("%02i:%02i:%02i", $DiffHour, $DiffMin, $DiffSec) return $DiffTime ;Difference in time in hh:mi:ss to be formatted as such endfunc
scriptkitty Posted November 6, 2004 Posted November 6, 2004 (edited) Many ways to do this. Here is a different approach. $Oldtime = "23:03:10" $NewTime = "23:03:09" $out=elapsedtime($OldTime, $NewTime ) msgbox(1,"",$out) Func ElapsedTime ( $OldTime, $NewTime ) $old=StringSplit($OldTime,":") $new=StringSplit($NewTime,":" ) $Oseconds=$old[3]+($old[2]*60)+($old[1]*3600) $Nseconds=$new[3]+($new[2]*60)+($new[1]*3600) if $Oseconds>$Nseconds then $Nseconds=$Nseconds+24*3600 $outsec=$Nseconds-$Oseconds $hour=Int($outsec/3600) $min=Int(($outsec-($hour*3600))/60) $sec=$outsec-($hour*3600)-($min*60) $DiffTime = StringFormat("%02i:%02i:%02i", $hour,$min,$sec) return $DiffTime endfunc oh yea, and found a slight flaw in yours while debugging my own version: Try $Oldtime = "23:03:10" $NewTime = "23:03:09" This is 24hours, 59min,and 59seconds, I doubt you wanted to return -1 sec. Edited November 6, 2004 by scriptkitty AutoIt3, the MACGYVER Pocket Knife for computers.
Developers Jos Posted November 6, 2004 Developers Posted November 6, 2004 (edited) I have developed a bunch of date functions back in february to be included in the standard UDF library being compiled ... It includes a _DateDiff function: #include <datenew.au3> Dim $HH, $MM, $SS $SS = _DateDiff('s', "2005/01/01 02:01:01", "2005/01/01 04:20:30") _TicksToTime($ss * 1000, $HH, $MM, $SS) MsgBox(0, 'test', StringFormat("%02i:%02i:%02i", $HH, $MM, $SS)) This is the list of extra function on top of the current DATE.AU3: ; Added: _DateAdd, _DateDiff, _DateToDayValue, _DayValueToDate ; _FormatDateTime, _DayOfWeek, _DateIsValid ; _SplitDateTime, _Now(), _NowTime(), _NowDate(),_DaysInMonth() ; _DaysOfWeek(), Nowcalc(), _JulianDayNo(), _JulianToDate($iJDay) Edited December 29, 2012 by Jon SciTE4AutoIt3 Full installer Download page - Beta files Read before posting How to post scriptsource Forum etiquette Forum Rules Live for the present, Dream of the future, Learn from the past.
scriptkitty Posted November 6, 2004 Posted November 6, 2004 (edited) Always nice to write your own and debug all the possible problems out But Premade ones are great time savers. My JedB lookalike version: ;=============================================================================== ; ; Description: Returns the difference in time. if $Oldtime>$Newtime it assumes a day has passed ; Parameter(s): $Oldtime = in format of hour:min:sec "23:03:10" ; $NewTime = in format of hour:min:sec "01:03:09" ; ; Requirement(s): None ; Return Value(s): On Success - time in format of 23:03:10 ; Author(s): Duane <scriptkitty@autoitscript.com> ; Note(s): English only ; ;=============================================================================== Func _ElapsedTime ( $OldTime, $NewTime ) $old=StringSplit($OldTime,":") $new=StringSplit($NewTime,":" ) $Oseconds=$old[3]+($old[2]*60)+($old[1]*3600) $Nseconds=$new[3]+($new[2]*60)+($new[1]*3600) if $Oseconds>$Nseconds then $Nseconds=$Nseconds+24*3600 $outsec=$Nseconds-$Oseconds $hour=Int($outsec/3600) $min=Int(($outsec-($hour*3600))/60) $sec=$outsec-($hour*3600)-($min*60) $DiffTime = StringFormat("%02i:%02i:%02i", $hour,$min,$sec) return $DiffTime endfunc Edited November 6, 2004 by scriptkitty AutoIt3, the MACGYVER Pocket Knife for computers.
OregonJohn Posted March 22, 2012 Posted March 22, 2012 ScriptKitty's version worked best for me, but I was getting weird results if the new minutes were :00. A look at the returned array showed me that my $NewTime and $OldTime were coming from the script with the date included, so the hour ($old[1]) included the date and messed up the calculations. I solved the problem by using StringRight on the $old[1]. I replaced: $Oseconds=$old[3]+($old[2]*60)+($old[1]*3600) $Nseconds=$new[3]+($new[2]*60)+($new[1]*3600) with StringRight($xxx[1],2) to eliminate the hours --- now the script works everytime $Oseconds=$old[3]+($old[2]*60)+(StringRight($old[1],2)*3600) $Nseconds=$new[3]+($new[2]*60)+(StringRight($old[1],2)*3600) I love AutoIt3!
Denvish Posted November 22, 2023 Posted November 22, 2023 11 years later... newish to AutoIT. Had slight issues with the above scripts, due to day changes and hours rounding down. So I figured why not use difference in UTC instead, but AutoIT returns it as a construct. However, GetTickCount (returns milliseconds since Windows started) works, and IMO is a tidier solution. Downside is that ticks will return to 0 if Windows runs for more than 49.7 days ;GRAB START TICKS - PLACE WHERE NECESSARY IN CODE Global $sT=_Date_Time_GetTickCount() ;GRAB FINISH TICKS - PLACE WHERE NECESSARY IN CODE Global $fT=_Date_Time_GetTickCount() TIMEPASSED($sT,$fT) Func TIMEPASSED($OT,$NT) $tp=Int(($NT-$OT)/1000) ;CONVERT FROM MSECS TO SECS $hh=Floor($tp/3600) ;PARSE OUT HOURS $tp=$tp-($hh*3600) ;DEDUCT HOURS FROM TIME PASSED $mm=Floor($tp/60) ;PARSE OUT MINUTES $ss=Int($tp-($mm*60)) ;PARSE SECONDS Return($hh&"h "&$mm&"m "&$ss&"s ") ;RETURN RESULT IN HH:MM:SS FORMAT EndFunc
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now