Mini UDF: GetUnixTimestamp - Konvertieren der Windows Systemzeit zur Unixzeit

  • Es gibt schon viele Ansätze für AutoIt um einen Unix Zeitstempel zu erzeugen. Wirklich gefallen hat mir davon keiner, deshalb habe ich mich entschlossen selbst zu experimentieren. Das hier ist dabei herausgekommen...
    Diese kleine "UDF" beinhaltet folgende Funktionen:

    • _NtQuerySystemTime - Eine Funktion um die Systemzeit von Windows in 100 Nanosekunden Intervallen seit dem 1. Januar 1601 (UTC) auszulesen.
    • _RtlTimeToSecondsSince1970 - Eine Funktion um eine Zeit in 100 Nanosekunden Intervallen seit dem 1. Januar 1601 (UTC) zur Unixzeit (Sekunden seit dem 1. Januar 1970 (UTC)) umzuwandeln.
    • _GetUnixTime - Eine kleine Funktion welche die anderen beiden zusammenfasst um bequem die aktuelle Unixzeit/Unix timestamp auslesen zu können.


    Bei allen Funktionen sind dieses mal ausnahmsweise ausgefüllte Funktionsheader dabei. Die Beschreibungen habe ich aus Versehen in Englisch verfasst, ich kann sie ja bei Bedarf übersetzen ^^.
    MSDN Links zu den Ntdll Funktionen sind in den Funktionsheadern unter "Link" zu finden.

    In der Datei ist außerdem ein recht überflüssiges und kurzes Beispiel enthalten.
    Viel Spaß damit. Bei Fragen und Feedback bitte melden.

    Script:

    GetUnixTimestamp
    [autoit]

    $hNtDll = DllOpen("Ntdll.dll")

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

    $iSysTime = _NtQuerySystemTime($hNtdll)
    $iUnixTime = _RtlTimeToSecondsSince1970($iSysTime, $hNtdll)

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

    ConsoleWrite("System time: " & $iSysTime & @CRLF & _
    "... in Unix time: " & $iUnixTime & @CRLF & _
    "Another Unix Timestamp: " & _GetUnixTimestamp() & @CRLF)

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

    DllClose($hNtDll)

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _NtQuerySystemTime
    ; Description ...: Returns the system time in a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC).
    ; Syntax ........: _NtQuerySystemTime([$_hNtdll = Default])
    ; Parameters ....: $_hNtdll - [optional] Handle to an opened Ntdll.dll file.
    ; Return values .: Success - System time in a 64-bit integer.
    ; Failure - -1 and sets @error to 1.
    ; Author ........: name22 (http://www.autoit.de)
    ; Modified ......:
    ; Remarks .......:
    ; Related .......: _RtlTimeToSecondsSince1970
    ; Link ..........: http://msdn.microsoft.com/en-us/library/…v=vs.85%29.aspx
    ; Example .......: Yes
    ; ===============================================================================================================================
    Func _NtQuerySystemTime($_hNtdll = Default)
    If $_hNtdll = Default Then $_hNtdll = "Ntdll.dll"

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

    $_aRet = DllCall($_hNtdll, "INT", "NtQuerySystemTime", "INT64*", "")
    If @error Then Return SetError(1, 0, -1)

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

    Return $_aRet[1]
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _RtlTimeToSecondsSince1970
    ; Description ...: Converts the specified 64-bit system time to the number of seconds since the beginning of January 1, 1970.
    ; Syntax ........: _RtlTimeToSecondsSince1970($_iTime[, $_hNtdll = Default])
    ; Parameters ....: $_iTime - 64-bit integer specifying the time in 100 nanosecond intervals since January 1, 1601 (UTC).
    ; $_hNtdll - [optional] Handle to an opened Ntdll.dll file
    ; Return values .: Success - Converted Unix time.
    ; Failure - -1 and sets @error to 1.
    ; Author ........: name22 (http://www.autoit.de)
    ; Modified ......:
    ; Remarks .......:
    ; Related .......: _NtQuerySystemTime
    ; Link ..........: http://msdn.microsoft.com/en-us/library/…v=vs.85%29.aspx
    ; Example .......: Yes
    ; ===============================================================================================================================
    Func _RtlTimeToSecondsSince1970($_iTime, $_hNtdll = Default)
    If $_hNtdll = Default Then $_hNtdll = "Ntdll.dll"

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

    $_aRet = DllCall($_hNtdll, "BOOL", "RtlTimeToSecondsSince1970", "INT64*", $_iTime, "INT64*", "")
    If @error Then Return SetError(1, 0, -1)

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

    Return $_aRet[2]
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _GetUnixTimestamp
    ; Description ...: Returns the Unix Timestamp (or the number of seconds since January 1, 1970 according to system time).
    ; Syntax ........: _GetUnixTimestamp()
    ; Parameters ....:
    ; Return values .: Unix Timestamp.
    ; Author ........: name22 (http://www.autoit.de)
    ; Modified ......:
    ; Remarks .......: Not really necessary, since the code fits into one line. Mostly an example for retrieving the unix timestamp.
    ; Related .......: _NtQuerySystemTime, _RtlTimeToSecondsSince1970
    ; Link ..........: http://en.wikipedia.org/wiki/Unix_time
    ; Example .......: Yes
    ; ===============================================================================================================================
    Func _GetUnixTimestamp()
    Return _RtlTimeToSecondsSince1970(_NtQuerySystemTime())
    EndFunc

    [/autoit]


    Download:
    autoit.de/wcf/attachment/22567/