Vivaed

Parse time from each line of log (text file)

21 posts in this topic

I have another AutoIT script making a Log file 

Sample of Log file:

2016/08/22 12:44:18 > Process: [RUNNING] [ACTIVE]
2016/08/22 12:48:35 > Process: [WAS NOT RUNNING]
2016/08/22 13:40:00 > Process: [FAILED]
2016/08/22 14:01:10 > Process: [WAS NOT RUNNING]

I am looping through the Log file for  the word "FAILED"

I then want to get all lines that have "FAILED" and get their TIME

 

My Current code to get this far:

If FileExists($fileLog) Then
    $contents = FileRead($fileLog)
    If @error Then
        MsgBox(0, 'File Error', $fileLog & ' could not be read.')
    Else
        For $i = 1 To _FileCountLines($fileLog)
            $result = StringInStr($contents,$search)
            If $result >= 1 Then
                $filteredLine = FileReadLine($fileLog,$i)
                If StringInStr($filteredLine,$search) Then
                    ConsoleWrite($filteredLine & @CRLF)     ; this gets me the results I want sans the time parse
                EndIf
            Else
                ConsoleWrite( $search & " not found!" & @CRLF)
            EndIf
    Next
    EndIf
EndIf

For this part:

If StringInStr($filteredLine,$search) Then
  ConsoleWrite($filteredLine & @CRLF)   ; this gets me the results I want sans the time parse
EndIf

OUTPUT: 2016/08/22 13:40:00 > Process: [FAILED]

I dont understand how I read the time in that output?

 

I have tried _DateTimeFormat - Dont think this applies 

Tried _DateDiff - I dont have a the date yet so this doesnt work

 

Would love if someone could tell me if I am thinking is the wrong direction and possibly lead me down the correct path to light side of the force :) 

 

Share this post


Link to post
Share on other sites



@Vivaed welcome to the forum. Does the output need to be in date format, or will a string work for your needs? Something like this works, based on the Log file sample you provided (which I expanded a bit).

#include <Array.au3>
#include <File.au3>

Local $aFile = FileReadToArray(@DesktopDir & "\Test.log")
Local $aTemp

    For $sLine In $aFile
        If StringInStr($sLine, "[FAILED]") Then
            $aTemp = StringSplit($sLine, ">")
            FileWriteLine(@DesktopDir & "\Output.txt", $aTemp[1] & " - Failed")
        EndIf
    Next

It returns the following:

2016/08/21 13:40:00  - Failed
2016/08/22 13:40:00  - Failed
2016/08/23 13:40:00  - Failed
2016/08/24 13:40:00  - Failed
2016/08/25 13:40:00  - Failed
2016/08/26 13:40:00  - Failed
2016/08/27 13:40:00  - Failed
2016/08/28 13:40:00  - Failed

 


√-1 2^3 ∑ π, and it was delicious!

Share this post


Link to post
Share on other sites

Thanks for the Prompt response!!! @JLogan3o13

 

So I might not have explained it well lol

2016/08/22 13:40:00 > Process: [FAILED]
2016/08/22 13:41:00 > Process: [FAILED]
2016/08/22 13:48:00 > Process: [FAILED]
2016/08/22 13:51:00 > Process: [FAILED]
2016/08/22 14:00:00 > Process: [FAILED]

Above is my actual log file

 

Lets say my current time was  2016/08/22 14:01:00

I want to look at my log file and compare the log files time stamps to _NowCalc(), I will use _DateDiff() (But that comes later)

 

Essentially what I am trying to do:

If the log file has >= 1 FAILED log line(s) in the past 15 mins then send email with these errors inside


I dont know how I parse for the date in the log file, I have tried Googled all I know #StillLearning

Share this post


Link to post
Share on other sites

Did you look at the code that I posted? Your first post was indeed a bit unclear, but the code should be roughly the same: you read the file to an array and parse through it. You then stringsplit the lines to give you your time:

#include <Array.au3>
#include <File.au3>

Local $aFile = FileReadToArray(@DesktopDir & "\Test.log")
Local $aTemp

    For $sLine In $aFile
        $aTemp = StringSplit($sLine, ">")
        $sTime = $aTemp[1]
    Next

If you do a consolewrite, you will see that the output is:

2016/08/22 13:40:00 
2016/08/22 13:41:00 
2016/08/22 13:48:00 
2016/08/22 13:51:00 
2016/08/22 14:00:00

 


√-1 2^3 ∑ π, and it was delicious!

Share this post


Link to post
Share on other sites
13 minutes ago, JLogan3o13 said:

Did you look at the code that I posted? Your first post was indeed a bit unclear, but the code should be roughly the same: you read the file to an array and parse through it. You then stringsplit the lines to give you your time:

#include <Array.au3>
#include <File.au3>

Local $aFile = FileReadToArray(@DesktopDir & "\Test.log")
Local $aTemp

    For $sLine In $aFile
        $aTemp = StringSplit($sLine, ">")
        $sTime = $aTemp[1]
    Next

If you do a consolewrite, you will see that the output is:

2016/08/22 13:40:00 
2016/08/22 13:41:00 
2016/08/22 13:48:00 
2016/08/22 13:51:00 
2016/08/22 14:00:00

 

Interesting, I will have to learn more about this StringSplit() 

 

Thanks for the insight, I hope it leads me down a better path lol

Share this post


Link to post
Share on other sites

If your log file is significantly large, you'd probably better use a database to store log entries. SQLite is a very good candidate and is simple and efficient to setup and use.


This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Share this post


Link to post
Share on other sites

#7 ·  Posted (edited)

Vivaed,

Another way to do this...

#include <array.au3>
#include <date.au3>

Local $aFailed = StringRegExp(FileRead(@ScriptDir & '\log.test.txt'), '(?i).*?failed.*', 3)

For $i = 0 To UBound($aFailed) - 1
    If _DateDiff('n', StringLeft($aFailed[$i], 19), _NowCalc()) <= 15 Then
        ;
        ; This is where you would do your email routine...I just print the entry to console...
        ;
        ConsoleWrite('! ' & $aFailed[$i] & ' ' & _DateDiff('n', StringLeft($aFailed[$i], 19), _NowCalc()) & ' minutes ago...' & @CRLF)
        ;
    EndIf
Next

How large is your log file?

How is the file(s) managed? (hourly, daily, rolling, etc)

How often do you want to scan the file(s)?

kylomas

edit: file used for testing log.test.txt

Edited by kylomas

Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Share this post


Link to post
Share on other sites

@kylomas Thanks for the reply!

Another application checks to see if a process is running every minute and logs if [PASS] or [FAILED]

Then this app checks every 15 mins. It looks for if there were any fails in the last 15 mins, if so then email support team.

 

@jchd The log files are short for now, I could see them potentially getting long, but I would just delete them until another solution was created.

Share this post


Link to post
Share on other sites

Okay, I have the fist part working (Read log get FAILED lines and make new file with all FAILED lines):

#include <File.au3>
#include <Array.au3>
#NoTrayIcon
#include <AutoItConstants.au3>
#include <TrayConstants.au3>
#include <FileConstants.au3>
#include <Date.au3>
#include <WinAPIFiles.au3>


Global $file_output = FileOpen("C:\WB Resources\" & @ComputerName & "-FAILED-output.txt", 1)
Global $file_output_wipe = FileOpen("C:\WB Resources\" & @ComputerName & "-FAILED-output.txt", 2)
Global $fileLog = "C:\WB Resources\" & @ComputerName & "-WBLog.txt"
Global $fileOutput = "C:\WB Resources\" & @ComputerName & "-FAILED-output.txt"

$search = "FAILED"

Global $aFile = FileReadToArray($fileOutput)
Global $sTemp = ''

ConsoleWrite(_FileCountLines($fileLog) & @CRLF)
ConsoleWrite("NOW CALC TIME " & @CRLF & _NowCalc() & @CRLF)

If FileExists($fileLog) Then
    $contents = FileRead($fileLog)
    If @error Then
        MsgBox(0, 'File Error', $fileLog & ' could not be read.')
    Else
        For $i = 1 To _FileCountLines($fileLog)
            $result = StringInStr($contents, $search)
            If $result >= 1 Then
                $filteredLine = FileReadLine($fileLog, $i)
                If StringInStr($filteredLine, $search) Then
                    FileWrite($fileOutput,$filteredLine & @CRLF)
                EndIf
            Else
                ConsoleWrite($search & " not found!" & @CRLF)
                FileWrite($file_output_wipe, $search & " not found!" & @CRLF)
            EndIf
        Next
    EndIf

EndIf

;~ ----------------------------------------------BROKEN
;~ For $sLine In $aFile
;~  $aTemp = StringSplit($sLine, ">")
;~  $sTime = $aTemp[1]
;~  ConsoleWrite($sTime & @CRLF)
;~  FileWrite($file_output_wipe,$sTime & @CRLF)
;~  Local $theDiff = _DateDiff('n', $sTime, _NowCalc())
;~ Next
;~ If $theDiff <= 15 Then
;~  ConsoleWrite($filteredLine & " " & $theDiff & " " & @CRLF)
;~  FileWrite($file_output,$filteredLine & @CRLF)
;~ Else
;~ EndIf
;~ ----------------------------------------------BROKEN

FileClose($file_output)
Exit


But as you can see the bottom FOR statement doesn't work ( when un-commented lol )

Console Output:

(65) : ==> Variable must be of type "Object".:
For $sLine In $aFile
For $sLine In $aFile^ ERROR
->09:45:23 AutoIt3.exe ended.rc:1
+>09:45:23 AutoIt3Wrapper Finished.
>Exit code: 1    Time: 0.8435

I am missing something very obvious aren't I?

Share this post


Link to post
Share on other sites

After your FileReadToArray line, put an _ArrayDisplay($aFile). Does it show up as you would expect it to?


√-1 2^3 ∑ π, and it was delicious!

Share this post


Link to post
Share on other sites
1 minute ago, JLogan3o13 said:

After your FileReadToArray line, put an _ArrayDisplay($aFile). Does it show up as you would expect it to?

This?

Local $aFile = FileReadToArray($fileOutput)
ConsoleWrite(_ArrayDisplay($aFile))

Share this post


Link to post
Share on other sites

@Vivaed you need to look these functions up in the help file so you know HOW things work. Try this:

Local $aFile = FileReadToArray($fileOutput)
_ArrayDisplay($aFile)

Does it show you the array you're expecting to see?


√-1 2^3 ∑ π, and it was delicious!

Share this post


Link to post
Share on other sites
1 minute ago, JLogan3o13 said:

@Vivaed you need to look these functions up in the help file so you know HOW things work. Try this:

Local $aFile = FileReadToArray($fileOutput)
_ArrayDisplay($aFile)

Does it show you the array you're expecting to see?

@JLogan3o13 No it does not, looks like it passes right over it

 

I will do more research on FileReadArray

Share this post


Link to post
Share on other sites

#14 ·  Posted (edited)

So, that means it is not finding the file at that location, most likely. You could do something like this to confirm:

If FileExists("path to file") Then 
   FileReadToArray("path to file")
Else
   ConsoleWrite("Couldn't Find File" & @CRLF)
EndIf

 

Edited by JLogan3o13

√-1 2^3 ∑ π, and it was delicious!

Share this post


Link to post
Share on other sites
3 minutes ago, JLogan3o13 said:

So, that means it is not finding the file at that location, most likely. You could do something like this to confirm:

If FileExists("path to file") Then 
   FileReadyToArray("path to file")
Else
   ConsoleWrite("Couldn't Find File" & @CRLF)
EndIf

 

Its weird but I just put the snippet of code in the original IF statement:
 

If FileExists($fileLog) Then
    $contents = FileRead($fileLog)
    If @error Then
        MsgBox(0, 'File Error', $fileLog & ' could not be read.')
    Else
        For $i = 1 To _FileCountLines($fileLog)
            $result = StringInStr($contents,$search)
            If $result >= 1 Then
                $filteredLine = FileReadLine($fileLog,$i)
                If StringInStr($filteredLine,$search) Then
                    For $sLine In $aFile
                        $aTemp = StringSplit($sLine, ">")
                        $sTime = $aTemp[1]
                        ConsoleWrite($sTime & @CRLF)
;~                      FileWrite($file_output,$filteredLine & @CRLF)

                        Local $theDiff =  _DateDiff('n', $sTime, _NowCalc())


                    Next
                        If $theDiff < 15 Then
                            ConsoleWrite($filteredLine & " " & $theDiff & " " & @CRLF)
                        Else

                        EndIf
                EndIf
            Else
                ConsoleWrite( $search & " not found!" & @CRLF)
                FileWrite($file_output,$search & " not found!" & @CRLF)
            EndIf
    Next
    EndIf
FileClose($file_output)
EndIf

AND ITS OUTPUTTING????? (Kind of)

37
NOW CALC TIME 
2016/08/23 12:06:22
2016/08/23 09:01:23 
2016/08/23 09:09:28 
2016/08/23 09:10:36 
2016/08/23 09:11:38 
2016/08/23 09:11:41 
2016/08/23 09:12:43 
2016/08/23 09:14:45 
2016/08/23 09:29:45 
2016/08/23 09:29:50 
2016/08/23 09:29:55 
2016/08/23 09:30:33 
2016/08/23 09:01:23 
2016/08/23 09:09:28 
2016/08/23 09:10:36 
2016/08/23 09:11:38 
2016/08/23 09:11:41 
2016/08/23 09:12:43 
2016/08/23 09:14:45 
2016/08/23 09:29:45 
2016/08/23 09:29:50 
2016/08/23 09:29:55 
2016/08/23 09:30:33 
2016/08/23 09:01:23 
2016/08/23 09:09:28 
2016/08/23 09:10:36 
2016/08/23 09:11:38 
2016/08/23 09:11:41 
2016/08/23 09:12:43 
2016/08/23 09:14:45 
2016/08/23 09:29:45 
2016/08/23 09:29:50 
2016/08/23 09:29:55 
2016/08/23 09:30:33 
2016/08/23 09:01:23 
2016/08/23 09:09:28 
2016/08/23 09:10:36 
2016/08/23 09:11:38 
2016/08/23 09:11:41 
2016/08/23 09:12:43 
2016/08/23 09:14:45 
2016/08/23 09:29:45 
2016/08/23 09:29:50 
2016/08/23 09:29:55 
2016/08/23 09:30:33 
2016/08/23 09:01:23 
2016/08/23 09:09:28 
2016/08/23 09:10:36 
2016/08/23 09:11:38 
2016/08/23 09:11:41 
2016/08/23 09:12:43 
2016/08/23 09:14:45 
2016/08/23 09:29:45 
2016/08/23 09:29:50 
2016/08/23 09:29:55 
2016/08/23 09:30:33 
2016/08/23 09:01:23 
2016/08/23 09:09:28 
2016/08/23 09:10:36 
2016/08/23 09:11:38 
2016/08/23 09:11:41 
2016/08/23 09:12:43 
2016/08/23 09:14:45 
2016/08/23 09:29:45 
2016/08/23 09:29:50 
2016/08/23 09:29:55 
2016/08/23 09:30:33 
2016/08/23 09:01:23 
2016/08/23 09:09:28 
2016/08/23 09:10:36 
2016/08/23 09:11:38 
2016/08/23 09:11:41 
2016/08/23 09:12:43 
2016/08/23 09:14:45 
2016/08/23 09:29:45 
2016/08/23 09:29:50 
2016/08/23 09:29:55 
2016/08/23 09:30:33 
2016/08/23 09:01:23 
2016/08/23 09:09:28 
2016/08/23 09:10:36 
2016/08/23 09:11:38 
2016/08/23 09:11:41 
2016/08/23 09:12:43 
2016/08/23 09:14:45 
2016/08/23 09:29:45 
2016/08/23 09:29:50 
2016/08/23 09:29:55 
2016/08/23 09:30:33 
2016/08/23 09:01:23 
2016/08/23 09:09:28 
2016/08/23 09:10:36 
2016/08/23 09:11:38 
2016/08/23 09:11:41 
2016/08/23 09:12:43 
2016/08/23 09:14:45 
2016/08/23 09:29:45 
2016/08/23 09:29:50 
2016/08/23 09:29:55 
2016/08/23 09:30:33 
2016/08/23 09:01:23 
2016/08/23 09:09:28 
2016/08/23 09:10:36 
2016/08/23 09:11:38 
2016/08/23 09:11:41 
2016/08/23 09:12:43 
2016/08/23 09:14:45 
2016/08/23 09:29:45 
2016/08/23 09:29:50 
2016/08/23 09:29:55 
2016/08/23 09:30:33 
2016/08/23 09:01:23 
2016/08/23 09:09:28 
2016/08/23 09:10:36 
2016/08/23 09:11:38 
2016/08/23 09:11:41 
2016/08/23 09:12:43 
2016/08/23 09:14:45 
2016/08/23 09:29:45 
2016/08/23 09:29:50 
2016/08/23 09:29:55 
2016/08/23 09:30:33 
+>12:06:22 AutoIt3.exe ended.rc:0
+>12:06:22 AutoIt3Wrapper Finished.
>Exit code: 0    Time: 0.8868

I think this needs to be after FileRead??? I dont really know...

But this gets me a step closer lol
 

Share this post


Link to post
Share on other sites
2 hours ago, JLogan3o13 said:

If FileExists("path to file") Then    FileReadyToArray("path to file")

Very cute  :)

Share this post


Link to post
Share on other sites

Simple mistype on my part; now fixed.


√-1 2^3 ∑ π, and it was delicious!

Share this post


Link to post
Share on other sites

Of course it was... but it was a funny mistype   :)

Share this post


Link to post
Share on other sites

#19 ·  Posted (edited)

Vivaed,

This seems to be what you are trying to do.  I would strongly encourage you to take JL's advice and understand what each function does by reading the Help file.

#include <File.au3>
#include <Array.au3>
#NoTrayIcon
#include <AutoItConstants.au3>
#include <TrayConstants.au3>
#include <FileConstants.au3>
#include <Date.au3>
#include <WinAPIFiles.au3>

; name of log file
Global $fileLog = "C:\WB Resources\" & @ComputerName & "-WBLog.txt"
; name of output file
Global $fileOutput = "C:\WB Resources\" & @ComputerName & "-FAILED-output.txt"

; open output file for write..erase previous content
Global $file_output = FileOpen($fileOutput, 2)

; check that file opened
If $file_output = -1 Then Exit MsgBox(17, 'Output file failed to open', 'File = ' & $fileOutput)

$search = "FAILED"

; read log file to array
Global $aFile = FileReadToArray($fileLog)
If @error Then Exit MsgBox(17, 'Log file read to array failed', 'File = ' & $fileLog)

ConsoleWrite("NOW CALC TIME " & @CRLF & _NowCalc() & @CRLF)

; iterate through array of log entries lokkiing for a "failed" entry withini the last 15
; minutes.  If found writye it to the output file

For $i = 0 To UBound($aFile) - 1

    If StringInStr($aFile[$i], $search) > 0 Then
        If _DateDiff('n', StringLeft($aFile[$i], 19), _NowCalcDate()) <= 15 Then
            FileWrite($file_output, $aFile[$i])
            ConsoleWrite($aFile[$i] & @CRLF)
        EndIf
    EndIf

Next

FileClose($file_output)

kylomas

Edited by kylomas
2 people like this

Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Share this post


Link to post
Share on other sites

@kylomas Thanks for the insight!

I have been reading ton about these functions.

This script is interesting, it outputs all of the FAILED found but doesn't filter them by only showing the ones from the last 15 mins. since you used _NowCalcDate(), but if I change it to just _NowCalc() I get the results I am looking for.

I am very grateful for the code comments, they help me understand what is what and why things are happening!!!

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Similar Content

    • nacerbaaziz
      By nacerbaaziz
      hello
      please i need to link a progress bar with a time can you help me?
      e.g
      i want to set a progress bar for 10 sec
      am waiting for your answers
      thank you.
    • imitto
      By imitto
      Hello all!
      I use Autoit for a while, already made some automation for a TV station's master control room with it. I made a UDF to easily work with PAL timecode and time with milliseconds, convert, add or subtract them. Feel free to use it if you want something like this
      #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Res_Description=PAL Timecode Calculator UDF #AutoIt3Wrapper_Res_LegalCopyright=horvath.imre@gmail.com #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** ; ; #FUNCTION# ; Name...........: _tcAdd ; Description....: Returns addition of two timecodes ; Syntax.........: _tcAdd($fTc1, fTc2 [, $fFormat = "P"]) ; ; Parameters.....: $fTc1 - First timecode in hh:mm:ss.ff format ; $fTc2 - Second timecode in hh:mm:ss.ff format ; $fFormat - Time base - "P" (default): PAL (25 fps) ; "M" : millisecond ; ; Return value...: Sum of the two timecode in the selected format Func _tcAdd($fTc1, $fTc2, $fFormat = "P", $fHourFormat = 1) Local $fMs1 = _tcToMs($fTc1) Local $fMs2 = _tcToMs($fTc2) Local $fSumMs = $fMs1 + $fMs2 Return _msToTc($fSumMs, $fFormat, $fHourFormat) EndFunc ; #FUNCTION# ; Name...........: _tcsSub ; Description....: Returns addition of two timecodes ; Syntax.........: _tcSub($fTc1, fTc2 [, $fFormat = "P"]) ; ; Parameters.....: $fTc1 - First timecode in hh:mm:ss.ff format ; $fTc2 - Second timecode in hh:mm:ss.ff format ; $fFormat - Time base - "P" (default): PAL (25 fps) ; "M" : millisecond ; ; Return value...: Subtract $fTc2 from $fTc1 in the source format Func _tcSub($fTc1, $fTc2, $fFormat = "P") Local $fMs1 = _tcToMs($fTc1) Local $fMs2 = _tcToMs($fTc2) Local $fSumMs = $fMs1 - $fMs2 If $fSumMs < 0 Then $fSumMs = _tcToMs("24:00:00.00") - ($fSumMs * -1) EndIf Return _msToTc($fSumMs, $fFormat) EndFunc ; #FUNCTION# ; Name...........: _tcToMs ; Description....: Returns timecode converted to total milliseconds ; Syntax.........: _tcToMs($fTc) ; ; Parameters.....: $fTc - Timecode in hh:mm:ss.ff or hh:mm:ss:xxx format, where xxx are milliseconds ; ; Return value...: Milliseconds as an integer value Func _tcToMs($fTc) Local $fTemp = StringSplit($fTc, ":.") Local $fChr = StringLen($fTemp[4]) Switch $fChr Case 2 Return ($fTemp[4] * 40) + ($fTemp[3] * 1000) + ($fTemp[2] * 60000) + ($fTemp[1] * 3600000) Case 3 Return ($fTemp[4]) + ($fTemp[3] * 1000) + ($fTemp[2] * 60000) + ($fTemp[1] * 3600000) EndSwitch EndFunc ; #FUNCTION# ; Name...........: _msToTc ; Description....: Converts total milliseconds to timecode ; Syntax.........: _msToTc($fIn, $fFormat = "P", $fHourFormat = 1) ; ; Parameters.....: $fIn - Time in milliseconds ; $fFormat - Output format "P": PAL TC (default) ; "M": hh:mm:ss.xxx where xxx are milliseconds ; $fHourFormat - Hour format "1": max. value is 23, then starts from 0 (default) ; "0": hours can be more then 23 ; ; Return value...: Timecode as string in the selected format Func _msToTc($fIn, $fFormat = "P", $fHourFormat = 1) Switch $fFormat Case "P" Local $fFr = StringFormat("%02i", (StringRight($fIn, 3) - Mod(StringRight($fIn, 3), 40)) / 40) Case "M" Local $fFr = StringFormat("%03i", StringRight($fIn, 3)) EndSwitch $fIn = StringTrimRight($fIn, 3) Local $fSec = StringFormat("%02i", Mod($fIn, 60)) $fIn -= $fSec Local $fMinTot = $fIn / 60 Local $fMin = StringFormat("%02i", Mod($fMinTot, 60)) $fIn -= $fMin*60 Local $fHourTot = $fIn / 60 / 60 Switch $fHourFormat Case 1 $fHour = StringFormat("%02i", Mod($fHourTot, 24)) Case 0 $fHour = StringFormat("%02i", $fHourTot) EndSwitch Return($fHour & ":" & $fMin & ":" & $fSec & "." & $fFr) EndFunc ; #FUNCTION# ; Name...........: _tcFormatChange ; Description....: Toggle TC format ; Syntax.........: _tcFormatChange($fTc) ; ; Parameters.....: $fTc - Timecode in hh:mm:ss.ff or hh:mm:ss:xxx format, where xxx are milliseconds ; ; Return value...: PAL timecode or time with milliseconds as string, depends on input Func _tcFormatChange($fTc) Local $fTemp = StringSplit($fTc, ":.") Local $fChr = StringLen($fTemp[4]) Switch $fChr Case 2 Return $fTemp[1]&":"&$fTemp[2]&":"&$fTemp[3]&"."&StringFormat("%03i", $fTemp[4]*40) Case 3 Return $fTemp[1]&":"&$fTemp[2]&":"&$fTemp[3]&"."&StringFormat("%02i", ($fTemp[4]-Mod($fTemp[4], 40))/40) EndSwitch EndFunc And the example script:
      #include<_PAL_TC_Calc.au3> $palTC1 = "00:01:12.20" $palTC2 = "23:59:50.02" $msTC1 = "00:01:12.800" $msTC2 = "23:59:50.120" MsgBox(0, "1", _tcAdd($palTC1, $palTC2)); Adds $palTC1 to $palTC2, turns hour back to 0 after 23, returns PAL TC format MsgBox(0, "2", _tcAdd($palTC1, $palTC2, "M")); Adds $palTC1 to $palTC2, turns hour back to 0 after 23, returns time with milliseconds format MsgBox(0, "3", _tcAdd($palTC1, $palTC2, "M", 0)); Adds $palTC1 to $palTC2, hours can be infinite, returns time with milliseconds format MsgBox(0, "4", _tcAdd($msTC1, $msTC2)); Adds $palTC1 to $palTC2, turns hour back to 0 after 23, returns PAL TC format MsgBox(0, "5", _tcAdd($msTC1, $msTC2, "M")); Adds $palTC1 to $palTC2, turns hour back to 0 after 23, returns time with milliseconds format MsgBox(0, "6", _tcAdd($msTC1, $msTC2, "M", 0)); Adds $palTC1 to $palTC2, hours can be infinite, returns time with milliseconds format MsgBox(0, "7", _tcSub($palTC2, $palTC1)); Subtract $palTC1 from $palTC2, returns PAL TC format MsgBox(0, "8", _tcSub($palTC2, $palTC1, "M")); Subtract $palTC1 from $palTC2, time with milliseconds format MsgBox(0, "9", _tcSub($msTC1, $msTC2)); Subtract $palTC1 from $palTC2, returns PAL TC format - when hits zero, counts back from 24:00:00.00 MsgBox(0, "10", _tcSub($msTC1, $msTC2, "M")); Subtract $palTC1 from $palTC2, time with milliseconds format - when hits zero, counts back from 24:00:00.000 MsgBox(0, "11", _tcFormatChange($palTC2)); Convert PAL TC to time with milliseconds and back MsgBox(0, "12", _tcFormatChange($msTC2)); Convert PAL TC to time with milliseconds and back  
      TC_CALC_example.au3
      _PAL_TC_Calc.au3
    • kawliga751
      By kawliga751
      I have established how to get tomorrows date however I can't seem to figure out how to format the date into my required format of MM/DD/YYYY.  
      I have this:
      $today=_DateToDayValue(@YEAR,@MON,@MDAY) Dim $Y, $M, $D $tomorrow=_DayValueToDate($today+1, $Y, $M, $D) The _DateToDayValue seems to have a fixed format.  I've also tried a :
      $vardate = _DateAdd( 'd',1, _NowCalcDate()) with a "StringSplit" and/or StringFormat but the _NowCalcDate seems to also be fixed to a YYYY/MM/DD format.
      I'm sure I'm missing something simple but am at a loss.
      Any help would be MUCH appreciated
       
       
    • Realm
      By Realm
      After Several Minutes searching the forums for a simple solution to calculating for the Unix Time, as required for another project I am working on, I was astonished to not find one clean and universal solution. After looking over the helpfile, I noticed one simple solution given in the example with _DateDiff(). However it did not account for my current timezone or daylight savings time.
      Without further ado... This is my example of Calculating for a current Unix Time stamp or  seconds since Jan, 1st, 1970 00:00:00 GMT.
      This function will account for your timezone as well as for daylight savings time.
      Update: v0.3
      -Added Function to revert a Unix Time stamp into Date form.
      -Added parameter to original _GetUnixTime() allowing for a custom date since Jan 1st 1970 to be passed and converted to Unix Time.
      #include <Date.au3> #include <Array.au3> #include <Constants.au3> Local $iUnixTime1 = _GetUnixTime() MsgBox($MB_SYSTEMMODAL, "Unix Timestamp", "Seconds Since Jan, 1st, 1970 00:00:00 GMT" & @CRLF & $iUnixTime1) Local $sUnixDate1 = _GetDate_fromUnixTime($iUnixTime1) MsgBox($MB_SYSTEMMODAL, "Unix Timestamp", "Get Date from Unix Timestamp in Local Time" & @CRLF & $sUnixDate1) $sUnixDate1 = _GetDate_fromUnixTime($iUnixTime1, False) MsgBox($MB_SYSTEMMODAL, "Unix Timestamp", "Get Date from Unix Timestamp with $iReturnLocal = False which returns UTC Time" & @CRLF & $sUnixDate1) Local $iUnixTime2 = _GetUnixTime('2013/01/01 00:00:00') MsgBox($MB_SYSTEMMODAL, "Unix Timestamp", "Seconds since 2013/01/01 00:00:00" & @CRLF & $iUnixTime2) ; Get timestamp for input datetime (or current datetime). Func _GetUnixTime($sDate = 0);Date Format: 2013/01/01 00:00:00 ~ Year/Mo/Da Hr:Mi:Se Local $aSysTimeInfo = _Date_Time_GetTimeZoneInformation() Local $utcTime = "" If Not $sDate Then $sDate = _NowCalc() If Int(StringLeft($sDate, 4)) < 1970 Then Return "" If $aSysTimeInfo[0] = 2 Then ; if daylight saving time is active $utcTime = _DateAdd('n', $aSysTimeInfo[1] + $aSysTimeInfo[7], $sDate) ; account for time zone and daylight saving time Else $utcTime = _DateAdd('n', $aSysTimeInfo[1], $sDate) ; account for time zone EndIf Return _DateDiff('s', "1970/01/01 00:00:00", $utcTime) EndFunc ;==>_GetUnixTime ;$blTrim: Year in short format and no seconds. Func _GetDate_fromUnixTime($iUnixTime, $iReturnLocal = True) Local $aRet = 0, $aDate = 0 Local $aMonthNumberAbbrev[13] = ["", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] Local $timeAdj = 0 If Not $iReturnLocal Then Local $aSysTimeInfo = _Date_Time_GetTimeZoneInformation() Local $timeAdj = $aSysTimeInfo[1] * 60 If $aSysTimeInfo[0] = 2 Then $timeAdj += $aSysTimeInfo[7] * 60 EndIf $aRet = DllCall("msvcrt.dll", "str:cdecl", "ctime", "int*", $iUnixTime + $timeAdj ) If @error Or Not $aRet[0] Then Return "" $aDate = StringSplit(StringTrimRight($aRet[0], 1), " ", 2) Return $aDate[4] & "/" & StringFormat("%.2d", _ArraySearch($aMonthNumberAbbrev, $aDate[1])) & "/" & $aDate[2] & " " & $aDate[3] EndFunc ;==>_GetUnixDate Enjoy!
      Realm
      Update: >Added some functionality and a suggestion from FireFox
    • Simpel
      By Simpel
      Hi, I created a gui with date field but formatted as time in HH:mm. It always shows "now-time". Even if I try to set it with GUICtrlSetData.
      #include <DateTimeConstants.au3> #include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> Example() Func Example() GUICreate("My GUI get date", 200, 200, 800, 200) Local $idDate = GUICtrlCreateDate("", 20, 20, 100, 20, $DTS_TIMEFORMAT) ; to select a specific default format Local $sStyle = "HH:mm" ; Just display hours and minutes <<<<<<<<<<<<<<<<<<<<<<<<<<<< GUICtrlSendMsg($idDate, $DTM_SETFORMATW, 0, $sStyle) ConsoleWrite(GUICtrlRead($idDate) & @CRLF) GUICtrlSetData($idDate, "00:00") ConsoleWrite(GUICtrlRead($idDate) & @CRLF) GUISetState(@SW_SHOW) ; Loop until the user exits. While GUIGetMsg() <> $GUI_EVENT_CLOSE WEnd MsgBox($MB_SYSTEMMODAL, "Time", GUICtrlRead($idDate)) EndFunc ;==>Example How can I set the time field with another time and how can this field be set blank?
      Regards, Conrad