FILETIME Converter

Convertitore da Windows FILETIME a timestamp Unix

Converti Windows FILETIME in tempo Unix con la formula esatta e supporto per valori grandi. Output in secondi, millisecondi, ISO 8601 e formato leggibile.

intervalli di 100 ns dal 01-01-1601 UTC

Ora corrente — Windows FILETIME
Timestamp Unix (s)

Che cos'è un FILETIME di Windows?

FILETIME è il formato di timestamp usato in tutta l'API di Windows. È un valore a 64 bit che conta il numero di intervalli di 100 nanosecondi (dieci-milionesimi di secondo) trascorsi dalle 00:00:00 del 1° gennaio 1601 UTC — l'inizio del ciclo del calendario gregoriano che Windows usa internamente.

  • Epoca: 1601-01-01 00:00:00 UTC
  • Risoluzione: tick da 100 nanosecondi (10.000.000 al secondo)
  • Larghezza: intero senza segno a 64 bit, spesso memorizzato come due DWORD a 32 bit (dwLowDateTime, dwHighDateTime)
  • Si trova in: tempi dei file NTFS, registro di Windows, Active Directory (es. lastLogonTimestamp, pwdLastSet) e log eventi

Come convertire FILETIME in un timestamp Unix

Ci sono 11.644.473.600 secondi tra l'epoca FILETIME (1601) e l'epoca Unix (1970). Dividi il FILETIME per 10.000.000 per ottenere i secondi, poi sottrai quell'offset.

  • Unix seconds = FILETIME / 10000000 − 11644473600
  • Unix milliseconds = FILETIME / 10000 − 11644473600000
  • Esempio: 133444736000000000 → 1700000000 secondi → 2023-11-14 22:13:20 UTC
  • Inverso: FILETIME = (Unix milliseconds + 11644473600000) × 10000

Precisione e casi limite

Un FILETIME per un momento attuale è circa 1,3 × 10^17, che supera l'intervallo di interi sicuri di un numero JavaScript (2^53). Questo convertitore analizza il valore con BigInt così non si perde precisione. La precisione sotto il millisecondo (le ultime quattro cifre) viene scartata convertendo in un timestamp Unix in millisecondi.

  • Active Directory a volte memorizza 0 o 9223372036854775807 per indicare «mai» — sono sentinelle, non date reali
  • FILETIME è sempre UTC; applica un fuso orario solo quando mostri il risultato
  • Le varianti in ora locale (da FileTimeToLocalFileTime) includono già l'offset — riconvertile prima in UTC

Convertitori di formato timestamp correlati

Consigli pratici su FILETIME

Alcune cose che ostacolano le conversioni FILETIME nel mondo reale:

  • PowerShell: [DateTime]::FromFileTimeUtc($ft) è la conversione canonica negli script
  • Active Directory usa spesso la costante 9223372036854775807 (Int64.MaxValue) per «non scade mai» — trattala come sentinella, non come data
  • AD usa anche 0 per «mai impostato»; gestisci sia 0 sia Int64.MaxValue in modo speciale
  • I tempi dei file NTFS hanno tre varianti: creazione, ultima scrittura, ultimo accesso — tutte usano lo stesso formato FILETIME
  • Quando FILETIME è diviso in due DWORD a 32 bit, combinali come (high << 32) | low prima di convertire

FAQ

Cos'è l'epoch di FILETIME?
FILETIME conta intervalli di 100 nanosecondi dal 1° gennaio 1601 00:00:00 UTC, la data base che Windows usa per il calendario gregoriano.
Perché sottrarre 11644473600 secondi?
È il numero di secondi tra l'epoch FILETIME del 1601 e l'epoch Unix del 1970. Dividere FILETIME per 10.000.000 dà secondi dal 1601; sottrarre l'offset lo riporta al 1970.
Come converto un FILETIME memorizzato come due valori a 32 bit?
Combinali come FILETIME = (dwHighDateTime × 4294967296) + dwLowDateTime, poi converti quel valore a 64 bit come al solito.