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
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.