FILETIME Converter

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

Aktuelle Zeit — Windows-FILETIME
Unix-Timestamp (s)

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.