Kovacic Posted July 3, 2014 Posted July 3, 2014 (edited) Hi all! I am perplexed by something that should be simple. I am trying to make a small timer which will become part of a larger script, but I'm stuck on comparing the 2 times.. When you run the script, you hit OK on a message box, that's when the current system time and day of the year is saved to a variable.. when you hit OK again, the timer is stopped and the date and time are compared. I'm not using Timerinit() because I want the exact system time the timer started, and the exact system time the timer stopped. Then the time is compared and you get the difference. This is easy as long as I am subtracting 10 seconds from 15 seconds, but what if the start timeer got second: 45 and the top timer got second: 12? I'm sure this is cakewalk for anyone that got higher than a C in math, but I didnt. Can anyone shed some light on this for a simpleton like myself? expandcollapse popupMsgbox(0,"START","Click to start timer") $a = timestamp() Msgbox(0,"START","Click to stop timer") $b = timestamp() compare($a,$b) Func timestamp() Local $stSystemTime = DllStructCreate('ushort;ushort;ushort;ushort;ushort;ushort;ushort;ushort') DllCall('kernel32.dll', 'none', 'GetSystemTime', 'ptr', DllStructGetPtr($stSystemTime)) $sMilliSeconds = StringFormat('%03d', DllStructGetData($stSystemTime, 8)) $stSystemTime = 0 return @YDay & ':' & @Hour & ':' & @Min & ':' & @Sec & ':' & $sMilliSeconds EndFunc Func compare($start,$stop) $Comp_a = StringSplit($start,":",2) $Comp_b = StringSplit($stop,":",2) $DayDif = $comp_b[0] - $comp_a[0] $HourDif = $comp_b[1] - $comp_a[1] $MinDif = $comp_b[2] - $comp_a[2] $SecDif = $comp_b[3] - $comp_a[3] If $comp_b[4] > $comp_a[4] then $MSecDif = $comp_b[4] - $comp_a[4] else $MSecDif = $comp_a[4] - $comp_b[4] endif Msgbox(0,"hey you, yeah you!", "Elapse Time:" & @CRLF & "Days: " & $DayDif & @CRLF & "Hours: " & $HourDif & @CRLF & "Minutes: " & $MinDif & @CRLF & "Seconds: " & $SecDif & @CRLF & "Miliseconds: " & $MSecDif ) endfunc Thanks in advance!! EDIT: Would this logic work? ;example $start = 45 $stop = 12 $val1 = $Start - 60 ; val1 becomes 15 $Mydiff = $stop + $val1 Edited July 3, 2014 by Kovacic C0d3 is P0etry( ͡° ͜ʖ ͡°)
Moderators Melba23 Posted July 3, 2014 Moderators Posted July 3, 2014 Kovacic,Why not let AutoIt do all the work for you? expandcollapse popup#include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> #include <Date.au3> $hGUI = GUICreate("Test", 500, 500) $cStart = GUICtrlCreateButton("Start", 10, 10, 80, 30) $cStop = GUICtrlCreateButton("Stop", 10, 50, 80, 30) GUICtrlSetState($cStop, $GUI_DISABLE) GUISetState() While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit Case $cStart $sStart = _NowCalc() GUICtrlSetState($cStart, $GUI_DISABLE) GUICtrlSetState($cStop, $GUI_ENABLE) Case $cStop $sStop = _NowCalc() GUICtrlSetState($cStop, $GUI_DISABLE) GUICtrlSetState($cStart, $GUI_ENABLE) $iDays = _DateDiff("D", $sStart, $sStop) $sStart = _DateAdd("D", $iDays, $sStart) $iHours = _DateDiff("h", $sStart, $sStop) $sStart = _DateAdd("h", $iHours, $sStart) $iMins = _DateDiff("n", $sStart, $sStop) ConsoleWrite($sStart & @CRLF) $sStart = _DateAdd("n", $iMins, $sStart) ConsoleWrite($sStart & @CRLF) $iSecs = _DateDiff("s", $sStart, $sStop) MsgBox($MB_SYSTEMMODAL, "Time Diff:", $iDays & " days, " & $iHours & ":" & $iMins & ":" & $iSecs) EndSwitch WEndMuch easier! M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
Kovacic Posted July 3, 2014 Author Posted July 3, 2014 (edited) Kovacic, Why not let AutoIt do all the work for you? expandcollapse popup#include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> #include <Date.au3> $hGUI = GUICreate("Test", 500, 500) $cStart = GUICtrlCreateButton("Start", 10, 10, 80, 30) $cStop = GUICtrlCreateButton("Stop", 10, 50, 80, 30) GUICtrlSetState($cStop, $GUI_DISABLE) GUISetState() While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit Case $cStart $sStart = _NowCalc() GUICtrlSetState($cStart, $GUI_DISABLE) GUICtrlSetState($cStop, $GUI_ENABLE) Case $cStop $sStop = _NowCalc() GUICtrlSetState($cStop, $GUI_DISABLE) GUICtrlSetState($cStart, $GUI_ENABLE) $iDays = _DateDiff("D", $sStart, $sStop) $sStart = _DateAdd("D", $iDays, $sStart) $iHours = _DateDiff("h", $sStart, $sStop) $sStart = _DateAdd("h", $iHours, $sStart) $iMins = _DateDiff("n", $sStart, $sStop) ConsoleWrite($sStart & @CRLF) $sStart = _DateAdd("n", $iMins, $sStart) ConsoleWrite($sStart & @CRLF) $iSecs = _DateDiff("s", $sStart, $sStop) MsgBox($MB_SYSTEMMODAL, "Time Diff:", $iDays & " days, " & $iHours & ":" & $iMins & ":" & $iSecs) EndSwitch WEnd Much easier! M23 That was what I planned originally but I need to use milliseconds, but it looks like _DateDiff only handles as small as seconds.. Good call though Edited July 3, 2014 by Kovacic C0d3 is P0etry( ͡° ͜ʖ ͡°)
Moderators Melba23 Posted July 3, 2014 Moderators Posted July 3, 2014 (edited) Kovacic,Then we have to be creative: Case $cStart $sStart = _NowCalc() $iStartMS = @MSEC ConsoleWrite($sStart & "." & $iStartMS & @CRLF) GUICtrlSetState($cStart, $GUI_DISABLE) GUICtrlSetState($cStop, $GUI_ENABLE) Case $cStop $sStop = _NowCalc() $iStopMS = @MSEC ConsoleWrite($sStop & "." & $iStopMS & @CRLF) GUICtrlSetState($cStop, $GUI_DISABLE) GUICtrlSetState($cStart, $GUI_ENABLE) $iDays = _DateDiff("D", $sStart, $sStop) $sStart = _DateAdd("D", $iDays, $sStart) $iHours = _DateDiff("h", $sStart, $sStop) $sStart = _DateAdd("h", $iHours, $sStart) $iMins = _DateDiff("n", $sStart, $sStop) $sStart = _DateAdd("n", $iMins, $sStart) $iSecs = _DateDiff("s", $sStart, $sStop) ; See if Secs values are the same $iMSecs = $iStopMs - $iStartMS If StringRight($sStart, 2) <> StringRight($sStop, 2) Then If $iStartMS > $iStopMs Then $iMSecs = 1000 - $iStartMS + $iStopMS $iSecs -= 1 EndIf EndIf MsgBox($MB_SYSTEMMODAL, "Time Diff:", $iDays & " days, " & $iHours & ":" & $iMins & ":" & $iSecs & "." & $iMSecs)Checking the calculated time against the values written in the console it seems to be correct - over to you for more testing. M23Edit: Not quite - still working on it. 2nd Edit: Try now. Edited July 3, 2014 by Melba23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
Kovacic Posted July 3, 2014 Author Posted July 3, 2014 (edited) Kovacic, Then we have to be creative: Case $cStart $sStart = _NowCalc() $iStartMS = @MSEC ConsoleWrite($sStart & "." & $iStartMS & @CRLF) GUICtrlSetState($cStart, $GUI_DISABLE) GUICtrlSetState($cStop, $GUI_ENABLE) Case $cStop $sStop = _NowCalc() $iStopMS = @MSEC ConsoleWrite($sStop & "." & $iStopMS & @CRLF) GUICtrlSetState($cStop, $GUI_DISABLE) GUICtrlSetState($cStart, $GUI_ENABLE) $iDays = _DateDiff("D", $sStart, $sStop) $sStart = _DateAdd("D", $iDays, $sStart) $iHours = _DateDiff("h", $sStart, $sStop) $sStart = _DateAdd("h", $iHours, $sStart) $iMins = _DateDiff("n", $sStart, $sStop) $sStart = _DateAdd("n", $iMins, $sStart) $iSecs = _DateDiff("s", $sStart, $sStop) ; See if Secs values are the same $iMSecs = $iStopMs - $iStartMS If StringRight($sStart, 2) <> StringRight($sStop, 2) Then If $iStartMS > $iStopMs Then $iMSecs = 1000 - $iStartMS + $iStopMS $iSecs -= 1 EndIf EndIf MsgBox($MB_SYSTEMMODAL, "Time Diff:", $iDays & " days, " & $iHours & ":" & $iMins & ":" & $iSecs & "." & $iMSecs) Checking the calculated time against the values written in the console it seems to be correct - over to you for more testing. M23 Edit: Not quite - still working on it. 2nd Edit: Try now. Looking much better, im looking at the Ms now, heres what I got while testing: Start: 2014/07/03 12:21:54.200 Stop: 2014/07/03 12:21:55.879 Diff reported by script: Seconds: 1 Msec: 1679 Actual diff: Seconds: 1 Msec: 679 I think my brain hurts lol EDIT: one of our calculations is close... im about to build a counting GUI to test the theory: If $stop[1] >= $Start[1] then $HourDif = $stop[1] - $Start[1] else $HourDif = $Start[1] + ($stop[1] - 60) endif Edited July 3, 2014 by Kovacic C0d3 is P0etry( ͡° ͜ʖ ͡°)
BrewManNH Posted July 3, 2014 Posted July 3, 2014 I find that when comparing times it's much easier to convert both times to msec's subtract one from the other, and then turn that result into hh:mm:ss:ms rather than trying to do the math on the raw data. If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag GudeHow to ask questions the smart way! I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from. Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays. - ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script. - Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label. - _FileGetProperty - Retrieve the properties of a file - SciTE Toolbar - A toolbar demo for use with the SciTE editor - GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI. - Latin Square password generator
Kovacic Posted July 3, 2014 Author Posted July 3, 2014 I find that when comparing times it's much easier to convert both times to msec's subtract one from the other, and then turn that result into hh:mm:ss:ms rather than trying to do the math on the raw data. that was one of my earlier thoughts, however I will need to grab the current time and day, then a later time and day, and compare the two. The only way I can break that down to Msec is if I grab the current MS since the beginning of the year and calculate since then. C0d3 is P0etry( ͡° ͜ʖ ͡°)
Moderators Melba23 Posted July 3, 2014 Moderators Posted July 3, 2014 Kovacic,A couple of glasses of good red wine later - this might be the solution (with a big shout to BrewManNH for his suggestion above): Case $cStop $sStop = _NowCalc() $iStopMS = @MSEC ConsoleWrite($sStop & "." & $iStopMS & @CRLF) GUICtrlSetState($cStop, $GUI_DISABLE) GUICtrlSetState($cStart, $GUI_ENABLE) $iStartMs = (Number(StringRight($sStart, 2)) * 1000) + $iStartMS $iStopMs = (Number(StringRight($sStop, 2)) * 1000) + $iStopMS $iDiffMs = $iStopMs - $iStartMS $iDays = _DateDiff("D", $sStart, $sStop) $sStart = _DateAdd("D", $iDays, $sStart) $iHours = _DateDiff("h", $sStart, $sStop) $sStart = _DateAdd("h", $iHours, $sStart) $iMins = _DateDiff("n", $sStart, $sStop) $sStart = _DateAdd("n", $iMins, $sStart) $iSecs = Int($iDiffMs / 1000) $iMSecs = $iDiffMs - ($iSecs * 1000) ConsoleWrite($iSecs & "." & $iMSecs & @CRLF)I cannot break it after a good few tests - your turn. M23 Kovacic 1 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
Solution Gianni Posted July 3, 2014 Solution Posted July 3, 2014 also this could do expandcollapse popupMsgBox(0, "START", "Click to start timer") $a = timestamp() MsgBox(0, "STOP", "Click to stop timer") $b = timestamp() compare($a, $b) Func timestamp() Return @YDAY & ':' & @HOUR & ':' & @MIN & ':' & @SEC & ':' & @MSEC EndFunc ;==>timestamp Func compare($start, $stop) $Comp_a = StringSplit($start, ":", 2) $Comp_b = StringSplit($stop, ":", 2) Local $comp_c[5] ; start $Comp_a[0] = $Comp_a[0] * 86400000 ; Day $Comp_a[1] = $Comp_a[1] * 3600000 ; Hour $Comp_a[2] = $Comp_a[2] * 60000 ; Mins $Comp_a[3] = $Comp_a[3] * 1000 ; Sec ; stop $Comp_b[0] = $Comp_b[0] * 86400000 ; Day $Comp_b[1] = $Comp_b[1] * 3600000 ; Hour $Comp_b[2] = $Comp_b[2] * 60000 ; Mins $Comp_b[3] = $Comp_b[3] * 1000 ; Sec Local $started = $Comp_a[0] + $Comp_a[1] + $Comp_a[2] + $Comp_a[3] + $Comp_a[4] Local $stopped = $Comp_b[0] + $Comp_b[1] + $Comp_b[2] + $Comp_b[3] + $Comp_b[4] Local $elapsed = $stopped - $started ; elapsed time in milliseconds ; rebuild "days/time" $comp_c[0] = Int($elapsed / 86400000) ; days $elapsed -= $comp_c[0] * 86400000 $comp_c[1] = Int($elapsed / 3600000) ; hours $elapsed -= $comp_c[1] * 3600000 $comp_c[2] = Int($elapsed / 60000) ; mins $elapsed -= $comp_c[2] * 60000 $comp_c[3] = Int($elapsed / 1000) ; secs $elapsed -= $comp_c[3] * 1000 $comp_c[4] = $elapsed ; milliseconds Local $duration = $comp_c[0] & ":" & StringFormat("%02s", $comp_c[1]) & ":" & StringFormat("%02s", $comp_c[2]) & ":" & StringFormat("%02s", $comp_c[3]) & ":" & StringFormat("%03s", $comp_c[4]) MsgBox(0, $duration, "Started at " & $start & @CRLF & "Stopped at " & $stop & @CRLF & "Elapse Time : " & @CRLF & " Days : " & $comp_c[0] & @CRLF & " Hours : " & $comp_c[1] & @CRLF & " Minutes : " & $comp_c[2] & @CRLF & " Seconds : " & $comp_c[3] & @CRLF & " Miliseconds : " & $comp_c[4]) EndFunc ;==>compare p.s. is there a glass of wine for me too? Chimp small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....
Kovacic Posted July 3, 2014 Author Posted July 3, 2014 (edited) Between those two answers, I think that solved it!! Thanks!!!!!! WINE (or beer) FOR ALL! Edited July 3, 2014 by Kovacic C0d3 is P0etry( ͡° ͜ʖ ͡°)
Gianni Posted July 3, 2014 Posted July 3, 2014 a cold beer for me, thanks Chimp small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....
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