Windows FILETIME zu Unix-Timestamp-Konverter
Wandle Windows FILETIME in Unix-Zeit um — mit exakter Formel und Unterstützung großer Werte. Ausgabe in Sekunden, Millisekunden, ISO 8601 und lesbarem Format.
100-ns-Intervalle seit 01.01.1601 UTC
Was ist ein Windows-FILETIME?
FILETIME ist das Zeitstempelformat, das in der gesamten Windows-API verwendet wird. Es ist ein 64-Bit-Wert, der die Anzahl der 100-Nanosekunden-Intervalle (Zehnmillionstelsekunden) seit 00:00:00 am 1. Januar 1601 UTC zählt — dem Beginn des gregorianischen Kalenderzyklus, den Windows intern verwendet.
- Epoche: 1601-01-01 00:00:00 UTC
- Auflösung: 100-Nanosekunden-Ticks (10.000.000 pro Sekunde)
- Breite: 64-Bit-Ganzzahl ohne Vorzeichen, oft als zwei 32-Bit-DWORDs gespeichert (dwLowDateTime, dwHighDateTime)
- Zu finden in: NTFS-Dateizeiten, der Windows-Registry, Active Directory (z. B. lastLogonTimestamp, pwdLastSet) und Ereignisprotokollen
FILETIME in einen Unix-Zeitstempel umwandeln
Zwischen der FILETIME-Epoche (1601) und der Unix-Epoche (1970) liegen 11.644.473.600 Sekunden. Teile den FILETIME durch 10.000.000, um Sekunden zu erhalten, und subtrahiere dann diesen Versatz.
- Unix seconds = FILETIME / 10000000 − 11644473600
- Unix milliseconds = FILETIME / 10000 − 11644473600000
- Beispiel: 133444736000000000 → 1700000000 Sekunden → 2023-11-14 22:13:20 UTC
- Umgekehrt: FILETIME = (Unix milliseconds + 11644473600000) × 10000
Präzision und Sonderfälle
Ein FILETIME für einen heutigen Moment liegt bei etwa 1,3 × 10^17, was den sicheren Ganzzahlbereich einer JavaScript-Zahl (2^53) übersteigt. Dieser Konverter parst den Wert mit BigInt, sodass keine Präzision verloren geht. Die Sub-Millisekunden-Präzision (die letzten vier Ziffern) entfällt bei der Umwandlung in einen Millisekunden-Unix-Zeitstempel.
- Active Directory speichert manchmal 0 oder 9223372036854775807 für „nie“ — das sind Platzhalter, keine echten Daten
- FILETIME ist immer UTC; wende eine Zeitzone nur bei der Anzeige des Ergebnisses an
- Lokalzeit-Varianten (von FileTimeToLocalFileTime) enthalten den Versatz bereits — wandle diese zuerst zurück in UTC
Verwandte Zeitstempelformat-Konverter
Praktische FILETIME-Tipps
Ein paar Dinge, die bei FILETIME-Umrechnungen in der Praxis stolpern lassen:
- PowerShell: [DateTime]::FromFileTimeUtc($ft) ist die kanonische Umrechnung in Skripten
- Active Directory verwendet oft die Konstante 9223372036854775807 (Int64.MaxValue) für „läuft nie ab“ — als Platzhalter behandeln, nicht als Datum
- AD nutzt außerdem 0 für „nie gesetzt“; behandle sowohl 0 als auch Int64.MaxValue gesondert
- NTFS-Dateizeiten gibt es in drei Varianten: Erstellung, letzter Schreibzugriff, letzter Zugriff — alle verwenden dasselbe FILETIME-Format
- Wenn FILETIME in zwei 32-Bit-DWORDs aufgeteilt ist, vor der Umwandlung als (high << 32) | low kombinieren
FAQ
- Was ist die FILETIME-Epoch?
- FILETIME zählt 100-Nanosekunden-Intervalle seit dem 1. Januar 1601 00:00:00 UTC, dem Basisdatum, das Windows für den gregorianischen Kalender verwendet.
- Warum 11644473600 Sekunden abziehen?
- Das ist die Anzahl der Sekunden zwischen der FILETIME-Epoch von 1601 und der Unix-Epoch von 1970. FILETIME durch 10.000.000 zu teilen ergibt Sekunden seit 1601; das Abziehen des Versatzes verschiebt die Basis auf 1970.
- Wie wandle ich ein als zwei 32-Bit-Werte gespeichertes FILETIME um?
- Kombiniere sie als FILETIME = (dwHighDateTime × 4294967296) + dwLowDateTime und wandle diesen 64-Bit-Wert dann wie üblich um.