Windows Zeit -> UNIX Zeitstempel

  • Hallo zusammen,

    ich habe mir eine Funktion erstellt mit der man ein UNIX-Zeitstempel als Eingabeparameter hat und als Returnwert das daraus resultierende Datum erhält.

    Spoiler anzeigen


    Func _unixDateToWinDate($input_UnixDate)
    $winDate = _DateTimeFormat(_DateAdd('s', $input_UnixDate, "1970/01/01 01:00:00"), 0)
    Return $winDate
    EndFunc

    Jetzt habe ich versucht, das Ganze auch in umgekerhter Richtung zu realisieren, also Aktuelles Datum als Eingabeparameter und UNIX-Zeitstempel als Rückgabewert.
    Jedoch fehlt mir hier der Ansatz völlig :(

    Kennt jemand eine solche Funktion bzw. weiss ob es so etwas schon irgendwo mit AutoIT realisiert worden ist? Wäre für jeden Hinweis/Hilfe sehr Dankbar

    Tim

  • Also in diese Richtung habe ich das auch mal gemacht ... :rolleyes:

    Spoiler anzeigen
    [autoit]

    ;~ Author: <Der_Doc>
    ;~ Programm: <unixtime>
    ;~ AutoIt <Version: 3.2.2.0>
    ;~ Datum: <28.01.2008>
    #include <GUIConstants.au3>
    #include <date.au3>

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

    Dim $unix
    Dim $input_unix
    Dim $start
    Dim $ergebnis
    Dim $anzeige

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

    ;~ 1140777155

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

    #Region ### START Koda GUI section ### Form=unixtime.kxf
    $unixtime = GUICreate("UnixTime", 182, 173, 193, 115)
    $input_unix = GUICtrlCreateInput("", 30, 32, 129, 21)
    $start = GUICtrlCreateButton("start", 60, 122, 73, 33, 0)
    $ergebnis = GUICtrlCreateLabel("Ergebnis:", 30, 64, 61, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    $anzeige = GUICtrlCreateInput("", 30, 86, 129, 21)
    $unixtimestamp = GUICtrlCreateLabel("UnixTimestamp:", 32, 8, 79, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    case $start
    GUICtrlSetData($anzeige,_Timestamp($input_unix))
    EndSwitch
    WEnd

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

    Func _Timestamp($f_timestamp)
    $timestamp = _DateTimeFormat( _DateAdd( 's',GUICtrlRead($f_timestamp), "1970/01/01 01:00:00"),0)
    Return $timestamp
    EndFunc

    [/autoit]

    Aber die andere Richtung ist wirklich eine Herausforderung.

    Das Zeit/Datumsformat muß immer gleich sein. Also nicht mal Wochentag ausgeschrieben .... oder du mußt alle Möglichkeiten abfangen :wacko:
    Vielleicht versuche ich mich nachher mal daran.
    Erstmal was essen. ;)

    Aber diese Funktion wäre echt cool.
    Würde bei der Funktion mitarbeiten.

    MfG
    Der_Doc

  • Hallo Gwyn,

    das Beispiel aus der Hilfe zu _DateDiff ist die Antwort:

    [autoit]

    #include <Date.au3>

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

    ; Berechnet die Anzahl der Sekunden seit dem 01.01.1970 0:00:00 (Unixzeit EPOCH 1970/01/01 00:00:00)
    $iDateCalc = _DateDiff( 's',"1970/01/01 00:00:00",_NowCalc())
    MsgBox( 4096, "", "Vergangene Sekunden seit EPOCH: " & $iDateCalc )
    ;.......
    ; Details zur Unixzeit unter http://de.wikipedia.org/wiki/Unixzeit

    [/autoit]

    mfg (Auto)Bert

  • Hallo Gwyn,

    das Beispiel aus der Hilfe zu _DateDiff ist die Antwort:

    er wills doch andersrum oder hab ich da was falsch verstanden?

    von unixzeit zu normalzeit is ja kein problem.

  • So, dann muss man nurnoch vom String auf die einzelnen Werte kommen...

    nach AutoIt übersetzt
    [autoit]

    Func main()
    {
    Local $unix_sekunden = 0;
    Local $jahr=2009, $monat=11, $tag=26, $stunde=20, $minute=30;
    local $sekunde = 10;
    for $j=1970 To $jahr ;schaltjahr
    if Mod($j,4) = 0 And (Mod($j,100)<>0 Or Mod($j,400)=0) Then
    $unix_sekunden+=(366*24*60*60)
    else
    $unix_sekunden+=(365*24*60*60)
    endif
    Next
    for $j=1 To $monat ;monatstage 31/30/29/28
    if $j=1 Or $j=3 Or $j=5 Or $j=7 Or $j=8 Or $j=10 Or $j=12 Then $unix_sekunden+=(31*24*60*60); ;31 tägige monate
    if $j=4 Or $j=6 Or $j=9 Or $j=11 Then $unix_sekunden+=(30*24*60*60); ;30 tägige monate
    if ($j=2) And (Mod($jahr,4)=0 And (Mod($jahr,100)<>0 Or Mod($jahr,400)=0)) Then
    $unix_sekunden+=(29*24*60*60);
    else
    $unix_sekunden+=(28*24*60*60); ;februar 29tage/28tage
    EndIf
    Next
    $unix_sekunden+=(($tag-1)*24*60*60);
    $unix_sekunden+=($stunde*60*60)-xxxx; ;-xxxx (1h = 3600s) zeitzonen ausgleich
    $unix_sekunden+=$minute*60;
    $unix_sekunden+=$sekunde;
    EndFunc

    [/autoit]

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

  • Mh,
    aber irgendwie stimmt die Zeit dann net so richtig.

    Das kommt als Input
    Local $jahr=2009, $monat=11, $tag=26, $stunde=20, $minute=30;
    Local $sekunde = 10;

    Das kommt raus:
    1317587410

    Ergbniss laut meinem Tool (Rückrechnung):
    02.10.2011 21:30:10

    habe das mit folgendem Script gemacht: (Danke L3viathan2142)

    Spoiler anzeigen
    [autoit]

    msgbox(0,"Time",main())
    ClipPut(main())

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

    Func main()
    Local $unix_sekunden = 0;
    Local $jahr=2009, $monat=11, $tag=26, $stunde=20, $minute=30;
    local $sekunde = 10;
    for $j=1970 To $jahr ;schaltjahr
    if Mod($j,4) = 0 And (Mod($j,100)<>0 Or Mod($j,400)=0) Then
    $unix_sekunden+=(366*24*60*60)
    else
    $unix_sekunden+=(365*24*60*60)
    endif
    Next
    for $j=1 To $monat ;monatstage 31/30/29/28
    if $j=1 Or $j=3 Or $j=5 Or $j=7 Or $j=8 Or $j=10 Or $j=12 Then $unix_sekunden+=(31*24*60*60); ;31 tägige monate
    if $j=4 Or $j=6 Or $j=9 Or $j=11 Then $unix_sekunden+=(30*24*60*60); ;30 tägige monate
    if ($j=2) And (Mod($jahr,4)=0 And (Mod($jahr,100)<>0 Or Mod($jahr,400)=0)) Then
    $unix_sekunden+=(29*24*60*60);
    else
    $unix_sekunden+=(28*24*60*60); ;februar 29tage/28tage
    EndIf
    Next
    $unix_sekunden+=(($tag-1)*24*60*60);
    $unix_sekunden+=($stunde*60*60) ;-xxxx (1h = 3600s) zeitzonen ausgleich
    $unix_sekunden+=$minute*60;
    $unix_sekunden+=$sekunde;
    return $unix_sekunden
    EndFunc

    [/autoit]

    EDIT:
    Da stimmt allgemein was net.!!!
    Das Beispiel stimmt net. ich habe es nochmal mit mehreren Tools aus dem Internet abgeglichen.

    Spoiler anzeigen
    Code
    date -u -d @1234567890
     Fr 13. Feb 23:31:30 UTC 2009
    
    
    #Ergebnis was eigentlich rauskommen muß wäre
    14.02.2009 00:31:30  <---- mein Tool
    14.02.2009 - 00:31:30 <--- Internet Tool


    MfG
    Der_Doc

    Einmal editiert, zuletzt von Der_Doc (16. Februar 2010 um 18:56)

  • Hallo Zusammen,

    erstmal danke ich Euch für die rege Beteiligung, Hätte nicht gedacht, dass sich so schnell jemand meines Problems annehmen würde.

    Wozu brauche ich das Ganze?
    Wir schreiben in unserer Firma in unserem Programm logfiles im Format "1266318923277.log" (UNIX-Zeitstempel - letzte 3 Stellen werden nicht näher betrachtet). In diesesn Logfiles befinden sich Daten über Aktivitäten usw. gespeichert. Nun füllt sich der Ordner mit unmengen von logfiles. Diese sollen nun mit dem aktuellen Datum(Zeit) verglichen werden und abzüglich einer variablen Zeitspanne gelöscht werden. D.h. wenn Logfiles älter als beispielsweise 20 Tage sind - sollen sie nach aufruf des Scripts gelöscht werden.

    Ich würde nun gerne das aktuelle Datum mit dem aktuellen Datum vergleichen und abzüglich der definierten variablen Zeitspanne löschen. Das Ganze wäre theoretisch auch über "FileGetTime" (siehe Spoiler) möglich, jedoch habe ich hier das Problem, dass ich nicht wirklich das genaue Alter der Logfiles bestimmen kann, denn jeder Zugriff (auch wenn es nur das Anschauen der Datei-Eigenschaften ist) ändert mir das Zugriffsdatum der Datei und ich würde so unter umständen das falsche log weglöschen.

    Spoiler anzeigen


    Dies ist nur ein Code-Beispiel, die Dateien werden eigentlich in einem Array gepeichert und dann entsprechend verglichen und gelöscht (oder belassen)

    [autoit]


    $daysLimitToGoBack = 20
    $originalFile = "1266318923277.log"

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

    $Date = FileGetTime($originalFile, 1)
    $fDate = StringFormat("%s/%s/%s %s:%s:%s", $Date[0], $Date[1], $Date[2], $Date[3], $Date[4], $Date[5])

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

    If _DateDiff('d', $fDate, _NowCalc()) > $daysLimitToGoBackThen
    ; tue irgendwas... z.b. löschen
    EndIf

    [/autoit]
    • Offizieller Beitrag

    Warum so kompliziert? ältere Logs löschen mit Zeitstempel, kannst du doch einfach die Anzahl der Sekunden für den Zeitraum ausrechnen und den aktuellen Timestamp nehmen. alls Logs deren Differenz kleiner ist als aktuelles Datum (als Timestamp) - Differenzsekunden, müssen folglich älter sein. Und für die Sicherheit, kannst du ja nch dem letzten Eintrag sehen und dann entscheiden, ob gelöscht werden soll oder nicht. Unter Linux gibt es für sowas übrigens logrotate. unter windows kannst du ja mal hier schauen:
    http://www.datori.org/?p=7

  • Warum so kompliziert? ältere Logs löschen mit Zeitstempel, kannst du doch einfach die Anzahl der Sekunden für den Zeitraum ausrechnen und den aktuellen Timestamp nehmen. alls Logs deren Differenz kleiner ist als aktuelles Datum (als Timestamp) - Differenzsekunden, müssen folglich älter sein. Und für die Sicherheit, kannst du ja nch dem letzten Eintrag sehen und dann entscheiden, ob gelöscht werden soll oder nicht. Unter Linux gibt es für sowas übrigens logrotate. unter windows kannst du ja mal hier schauen:
    http://www.datori.org/?p=7

    ??? Jetzt häng ich etwas...
    D.h. ich nehmen mein Logfile (bspl. "1266318923277.log") setzte den Dateinamen in eine Variable (-> $DateiName = 1266318923) und rechne nun das aktuelle Datum (+ der variablen Zeitspanne z.b. 20 tage) in Sekunden um. Vergleich diese zwei Werte mit einander und wenn der Wert kleiner ist, ist dieses log zum löschen.

    Sorry ich versuchs noch irgendwie zu kapieren.

    Btw.:
    Danke für die Links - aber leider kann ich sie nicht verwenden, da wir in die Logfiles Daten reinschreiben, die wiederum auf andere Dateien hinweisen, die sofern das logfile gelöscht werden kann - ebenfalls gelöscht werden sollen (nicht über den Sinn nachfragen -> dass frage ich mich auch ab und an ...)

  • @GunFood
    ja das habe ich schon gesehen das war aber nicht wirklich das Problem :huh: leider

    Ich habe es nun so hinbekommen das das Jahr und die Zeit schon passt.
    Das Skript so konnte nicht ansatzweise Funktionieren.
    Habe es nun soweit das es passt bis eben auf Monate mit 31 Tagen, da fehlt immer 1 Tag :cursing:

    Hier das Skript

    Spoiler anzeigen
    [autoit]

    msgbox(0,"Time",main())
    ClipPut(main())

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

    Func main()
    Local $unix_sekunden = 0;
    Local $jahr=2008, $monat=04, $tag=1, $stunde=10, $minute=59, $sekunde = 10

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

    for $j=1971 To $jahr ;schaltjahr
    if (Mod($j,4) = 0) And (Mod($j,100)<>0 Or Mod($j,400)=0) Then
    $unix_sekunden+=(366*24*60*60)
    else
    $unix_sekunden+=(365*24*60*60)
    endif

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

    Next
    for $m=1 To $monat ;monatstage 31/30/29/28
    if $m=3 Or $m=5 Or $m=7 Or $m=8 Or $m=10 Or $m=12 Then $unix_sekunden+=(31*24*60*60); ;31 tägige monate <--- bekomme ich net hin
    if $m=4 Or $m=6 Or $m=9 Or $m=11 Then $unix_sekunden+=(30*24*60*60); ;30 tägige monate

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

    If ($m=2) then
    if (Mod($jahr,4)=0) And (Mod($jahr,100)<>0 Or Mod($jahr,400)=0) Then
    $unix_sekunden+=(29*24*60*60);
    else
    $unix_sekunden+=(28*24*60*60); ;februar 29tage/28tage
    EndIf
    EndIf
    Next

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

    $unix_sekunden+=(($tag-1)*24*60*60);
    $unix_sekunden+=($stunde*60*60)-3600 ;-xxxx (1h = 3600s) zeitzonen ausgleich
    $unix_sekunden+=$minute*60;
    $unix_sekunden+=$sekunde;
    return $unix_sekunden
    EndFunc

    [/autoit]

    Vielleicht findet ja einer noch nen Fehler.

    MfG
    Der_Doc

    • Offizieller Beitrag

    Ok. Mal an einem Beispiel:

    aktuelles Datum: 1266355555 (nicht UTC Format)
    Sekunden für die 20 Tage: 1728000

    Jetzt sollen alle Logfiles gefunden werden, die älter als 20 Tage sind. Also aktuelles Datum minus der 20 Tage:

    1266355555 - 1728000 = 1266182755

    Wenn das Datum des Logfiles nun kleiner als dieser errechnete Wert ist, so ist das File älter als die 20 Tage.

  • Ok. Mal an einem Beispiel:

    aktuelles Datum: 1266355555 (nicht UTC Format)
    Sekunden für die 20 Tage: 1728000

    Jetzt sollen alle Logfiles gefunden werden, die älter als 20 Tage sind. Also aktuelles Datum minus der 20 Tage:

    1266355555 - 1728000 = 1266182755

    Wenn das Datum des Logfiles nun kleiner als dieser errechnete Wert ist, so ist das File älter als die 20 Tage.

    Vielen Dank nochmal, mein Problem war das aktuelle Datum in ein UNIX TimeStamp umzuwandeln und danach die "Berechnung" durchzuführen.

    Hier habe ich eine Funktion die das aktuelle Datum in ein UNIX TimeStamp umwandelt, vielleicht hilft es dem einen oder anderen auch...

    Spoiler anzeigen

    Script zum Umwandeln des aktuellen Datums (Datum/Zeit) in das UNIX TimeStamp Format

    [autoit]


    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _GetUNIXTimeStamp
    ; Description ...: Get current time as Unix timestamp value
    ; Syntax.........: _GetUNIXTimeStamp()
    ; Parameters ....: None
    ; Return values .: $av_Time
    ; On Success - Returns Unix timestamp
    ; On Failure - Returns False, sets @error = 99
    ; Remarks .......:
    ; Example .......: _GetUNIXTimeStamp()
    ; Required ......: <_UnixTime.au3>
    ; ===============================================================================================================================
    Func _GetUNIXTimeStamp()
    Local $av_Time
    $av_Time = DllCall('CrtDll.dll', 'long:cdecl', 'time', 'ptr', 0)
    If @error Then
    SetError(99)
    Return False
    EndIf
    Return $av_Time[0]
    EndFunc

    [/autoit]

    Hier nochmals - Vielen DANK an alle die sich hier zum beheben meines Problem beteiligt haben