Convertisseur Windows FILETIME vers timestamp Unix
Convertissez Windows FILETIME en temps Unix avec la formule exacte et la prise en charge des grandes valeurs. Sortie en secondes, millisecondes, ISO 8601 et format lisible.
intervalles de 100 ns depuis le 01-01-1601 UTC
Qu'est-ce qu'un FILETIME Windows ?
FILETIME est le format d'horodatage utilisé dans toute l'API Windows. C'est une valeur 64 bits qui compte le nombre d'intervalles de 100 nanosecondes (dix-millionièmes de seconde) écoulés depuis 00:00:00 le 1er janvier 1601 UTC — le début du cycle du calendrier grégorien que Windows utilise en interne.
- Époque : 1601-01-01 00:00:00 UTC
- Résolution : ticks de 100 nanosecondes (10 000 000 par seconde)
- Largeur : entier non signé 64 bits, souvent stocké en deux DWORD 32 bits (dwLowDateTime, dwHighDateTime)
- Présent dans : les heures de fichiers NTFS, le registre Windows, Active Directory (p. ex. lastLogonTimestamp, pwdLastSet) et les journaux d'événements
Comment convertir un FILETIME en horodatage Unix
Il y a 11 644 473 600 secondes entre l'époque FILETIME (1601) et l'époque Unix (1970). Divisez le FILETIME par 10 000 000 pour obtenir des secondes, puis soustrayez ce décalage.
- Unix seconds = FILETIME / 10000000 − 11644473600
- Unix milliseconds = FILETIME / 10000 − 11644473600000
- Exemple : 133444736000000000 → 1700000000 secondes → 2023-11-14 22:13:20 UTC
- Inverse : FILETIME = (Unix milliseconds + 11644473600000) × 10000
Précision et cas limites
Un FILETIME pour un moment actuel vaut environ 1,3 × 10^17, ce qui dépasse la plage d'entiers sûrs d'un nombre JavaScript (2^53). Ce convertisseur analyse la valeur avec BigInt afin de ne perdre aucune précision. La précision infra-milliseconde (les quatre derniers chiffres) est abandonnée lors de la conversion en horodatage Unix en millisecondes.
- Active Directory stocke parfois 0 ou 9223372036854775807 pour signifier « jamais » — ce sont des sentinelles, pas de vraies dates
- FILETIME est toujours en UTC ; n'appliquez un fuseau qu'à l'affichage du résultat
- Les variantes en heure locale (issues de FileTimeToLocalFileTime) incluent déjà le décalage — reconvertissez-les d'abord en UTC
Convertisseurs de format d'horodatage associés
Conseils pratiques sur FILETIME
Quelques points qui piègent les conversions FILETIME dans la pratique :
- PowerShell : [DateTime]::FromFileTimeUtc($ft) est la conversion canonique dans les scripts
- Active Directory utilise souvent la constante 9223372036854775807 (Int64.MaxValue) pour « n'expire jamais » — à traiter comme sentinelle, pas comme date
- AD utilise aussi 0 pour « jamais défini » ; traitez 0 et Int64.MaxValue de façon spéciale
- Les heures de fichiers NTFS existent en trois variantes : création, dernière écriture, dernier accès — toutes utilisent le même format FILETIME
- Quand FILETIME est divisé en deux DWORD 32 bits, combinez-les en (high << 32) | low avant la conversion
FAQ
- Qu'est-ce que l'epoch FILETIME ?
- FILETIME compte des intervalles de 100 nanosecondes depuis le 1er janvier 1601 00:00:00 UTC, la date de base que Windows utilise pour le calendrier grégorien.
- Pourquoi soustraire 11644473600 secondes ?
- C'est le nombre de secondes entre l'epoch FILETIME de 1601 et l'epoch Unix de 1970. Diviser FILETIME par 10 000 000 donne des secondes depuis 1601 ; soustraire le décalage le rebase sur 1970.
- Comment convertir un FILETIME stocké sous forme de deux valeurs 32 bits ?
- Combinez-les en FILETIME = (dwHighDateTime × 4294967296) + dwLowDateTime, puis convertissez cette valeur 64 bits comme d'habitude.