Zeit umrechner

  • Hallo,
    gibt es eine UDF oder sonstiges was mir die Zeit umrechnet um zu gucken wie lange noch was dauert.
    Ich will in eine INI eine Uhrzeit schreiben (12:34) und wenn es so spät ist, dann soll eine MSG Box auftauchen. Aber es soll mir auch anzeigen wie lange es bis dahin dauert. Es kann auch Sein das es um 04:12 was sein soll und ich mein Script um 12:34 angemacht habe.

  • Ich hab da mal was vorbereitet:

    Spoiler anzeigen
    [autoit]

    Func GetTimeDiff($Zeit1,$Zeit2)
    Dim $Diff[3]
    Local $a, $b
    $a = StringReplace($Zeit1,":","")
    $b = StringReplace($Zeit2,":","")
    Select
    Case $a = $b
    For $i=0 To 2
    $Diff[$i] = 0
    Next
    Case $a > $b
    $Diff[0] = 1
    $Diff[1] = StringLeft($a,2) - StringLeft($b,2)
    $Diff[2] = StringRight($a,2) - StringRight($b,2)
    If StringRight($a,2) < StringRight($b,2) Then;Diese Zeile hab ich irgendwie unterschlagen - strg x statt strg c :P
    $Diff[1] -= 1
    $Diff[2] += 60
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Case $a < $b
    $Diff[0] = -1
    $Diff[1] = StringLeft($b,2) - StringLeft($a,2)
    $Diff[2] = StringRight($b,2) - StringRight($a,2)
    If StringRight($b,2) < StringRight($a,2) Then
    $Diff[1] -= 1
    $Diff[2] += 60
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndSelect
    Return $Diff
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    $a=GetTimeDiff("20:10","12:25")
    Switch $a[0]
    Case 0
    MsgBox(0,"Uhrzeitdiff","Beide Zeiten sind gleich!")
    Case 1
    MsgBox(0,"Uhrzeitdiff","Zeit 1 ist später, undzwar genau: "&$a[1]&" Stunde(n) und "&$a[2]&" Minute(n)!")
    Case -1
    MsgBox(0,"Uhrzeitdiff","Zeit 1 ist früher, undzwar genau: "&$a[1]&" Stunde(n) und "&$a[2]&" Minute(n)!")
    EndSwitch

    [/autoit]


    Es wird ein Array zurückgegeben mit folgender Struktur:
    Array[0] = 1 (Zeit 1 ist später), -1 (Zeit 1 ist früher) , 0 (Zeit 1 und Zeit 2 sind gleich)
    Array[1] = Differenz in Stunden
    Array[2] = Differenz in Minuten

    Viel Spaß damit :D
    PS: Falls du mehr Angaben überprüfen musst (z.B. Datum), dann würde ich auf die _DateDiff() Funktion hinweisen (siehe Hilfedatei -> F1 in Scite)

    EDIT: Danke für den Hinweis.. ist mir bei Copy&Paste passiert.. statt strg+c strg+x gedrückt :whistling:

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

    Einmal editiert, zuletzt von XovoxKingdom (11. April 2010 um 20:30)

  • Danke aber bei mir Zeigt es Minus Zahlen an 8| da kann doch was nicht stimmen.

    Edit: Könnte man da den Tag mit einbauen ?
    Weil das Script denkt ja wenn es 20:10 ist und was um 20:05 eintreffen soll, das es schon eingetroffen ist oder erst eintreffen wird :D

    Einmal editiert, zuletzt von Freaky (11. April 2010 um 20:14)

  • Soooo... ich hab da mal ein paar Sachen vorbereitet:

    Spoiler anzeigen
    [autoit]

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

    [/autoit] [autoit][/autoit] [autoit]

    $Datum1 = _NowCalc()
    $Datum2 = _NowCalc()
    $Datum2 = _DateAdd("s",100,$Datum2)
    $Temp = $Datum2
    $Tage = _DateDiff("D",$Datum1,$Temp)
    $Temp = _DateAdd("D",$Tage*(-1),$Temp)
    $Stunden = _DateDiff("h",$Datum1,$Temp)
    $Temp = _DateAdd("h",$Stunden*(-1),$Temp)
    $Minuten = _DateDiff("n",$Datum1,$Temp)
    $Temp = _DateAdd("n",$Minuten*(-1),$Temp)
    $Sekunden = _DateDiff("s",$Datum1,$Temp)
    $Temp = _DateAdd("s",$Sekunden*(-1),$Temp)
    MsgBox(0,"Datumvergleich","Datum1: "&$Datum1&@CRLF&"Datum2: "&$Datum2&@CRLF&"Tage: "&$Tage&@CRLF&"Stunden: "&$Stunden&@CRLF&"Minuten: "&$Minuten&@CRLF&"Sekunden: "&$Sekunden)

    [/autoit] [autoit][/autoit] [autoit]

    ;Datumsformat: JJJJ/MM/DD HH/MM/SS

    [/autoit] [autoit][/autoit] [autoit]

    Func ConvertDdate($Datum); Funktion zum umwandeln in das amerikanische Datum:
    $Reg = StringRegExp($Datum,"(\d{2})\.(\d{2})\.(\d{4})\s(\d{2}):(\d{2}):(\d{2})",3)
    Return $Reg[2]&"/"&$Reg[1]&"/"&$Reg[0]&" "&$Reg[3]&":"&$Reg[4]&":"&$Reg[5]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func ConvertAdate($Datum); Funktion zum umwandeln in das deutsche Datum:
    $Reg = StringRegExp($Datum,"(\d{4})/(\d{2})/(\d{2})\s(\d{2}):(\d{2}):(\d{2})",3)
    Return $Reg[2]&"."&$Reg[1]&"."&$Reg[0]&" "&$Reg[3]&":"&$Reg[4]&":"&$Reg[5]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Beispiel:
    $Amerikanisch = _NowCalc()
    MsgBox(0,"Beispiel: Datumswandel1","Amerikanisches Datum: "&$Amerikanisch)
    $Deutsch = ConvertAdate($Amerikanisch)
    MsgBox(0,"Beispiel: Datumswandel2","Deutsches Datum: "&$Deutsch)
    $WiederAmerikanisch = ConvertDdate($Deutsch)
    MsgBox(0,"Beispiel: Datumswandel3","Wieder das Amerikanische Datum: "&$WiederAmerikanisch)

    [/autoit]


    Guck dir die Beispiele genau an.. und vergiss nicht VOR dem benutzen von _Datediff das AMERIKANISCHE Datum zu benutzen (Umwandlungsfunktionen + Beispiele liegen bei)

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Am besten lässt sich das denke ich mal über eine SQLite Datenbank lösen. Ich arbeite momentan auch mit einer und das erleichert die arbeit wirklich.

    Hier mal ein Beispiel um abgelaufene Daten über SQL zu finden:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <Date.au3>
    #include <SQLite.au3>
    #include <SQLite.dll.au3>
    _DB_Start() ; :memory: Datenbank (Weil Beispiel)

    [/autoit] [autoit][/autoit] [autoit]

    ; Tabelle erstellen
    _DB_Exec("CREATE TABLE Events (id INTEGER PRIMARY KEY,date TEXT,description TEXT);")

    [/autoit] [autoit][/autoit] [autoit]

    ; Einträge machen
    _DB_Exec("INSERT INTO Events (id, date, description) VALUES (NULL,'1996/06/15 13:34','Irgend ein Datum')")
    _DB_Exec("INSERT INTO Events (id, date, description) VALUES (NULL,'2005/11/17 22:09','Noch so ein Datum')")
    _DB_Exec("INSERT INTO Events (id, date, description) VALUES (NULL,'2015/06/15 06:21','Das letzte Datum')")

    [/autoit] [autoit][/autoit] [autoit]

    ; Abgelaufene Events auflisten
    $iNow = _NowCalc()
    $aTmp = _DB_Query("SELECT * FROM Events WHERE date<'"&$iNow&"'")
    _ArrayDisplay($aTmp)

    [/autoit] [autoit][/autoit] [autoit]

    ; Events löschen
    _DB_Exec("DELETE FROM Events WHERE date<'"&$iNow&"'")

    [/autoit] [autoit][/autoit] [autoit]

    ;Restliche Tabelle anzeigen
    $aTmp = _DB_Query("SELECT * FROM Events")
    _ArrayDisplay($aTmp)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #region - SQL Funktionen
    Func _DB_Start($sPath = ":memory:")
    Local $fFE
    _SQLite_Startup()
    If @error > 0 Then
    MsgBox(16, "SQLite Error", "SQLite.dll Can't be Loaded!")
    Exit -1
    EndIf
    ConsoleWrite("_SQLite_LibVersion=" & _SQLite_LibVersion() & @CR)
    Return _SQLite_Open($sPath)
    EndFunc ;==>_DB_Start

    [/autoit] [autoit][/autoit] [autoit]

    Func _DB_Shutdown()
    _SQLite_Shutdown()
    EndFunc ;==>_DB_Shutdown

    [/autoit] [autoit][/autoit] [autoit]

    Func _DB_Exec($sMyQuery, $hDB = -1, $iSLN = @ScriptLineNumber)
    ConsoleWrite("+> SQLite Exec, Line " & $iSLN & @TAB & $sMyQuery & @CRLF)
    Local $iRet = _SQLite_Exec($hDB, $sMyQuery)
    Return SetError(@error, @extended, $iRet)
    EndFunc ;==>_DB_Exec

    [/autoit] [autoit][/autoit] [autoit]

    Func _DB_Query($sMyQuery, $hDB = -1, $iSLN = @ScriptLineNumber)
    ConsoleWrite("-> SQLite Query, Line " & $iSLN & @TAB & $sMyQuery & @CRLF)
    Local $hQuery, $aCol = 0, $iRow = 0, $hSize = 1000, $vSize = 0
    Dim $aRet[1000][50]
    _SQLite_Query($hDB, $sMyQuery, $hQuery)

    [/autoit] [autoit][/autoit] [autoit]

    While _SQLite_FetchData($hQuery, $aCol) = $SQLITE_OK
    $iRow += 1
    If $iRow = $hSize - 1 Then
    $hSize += 2000
    ReDim $aRet[$hSize][UBound($aRet, 2)]
    EndIf
    For $i = 0 To UBound($aCol) - 1
    If $vSize < $i Then $vSize = $i
    $aRet[$iRow][$i] = $aCol[$i]
    Next
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    $aRet[0][0] = $iRow
    $aRet[0][1] = $vSize + 1
    ReDim $aRet[$aRet[0][0] + 1][$aRet[0][1]]
    Return $aRet
    EndFunc ;==>_DB_Query
    #endregion

    [/autoit]