FILETIME Converter

Convertidor de Windows FILETIME a timestamp Unix

Convierte Windows FILETIME a tiempo Unix con la fórmula exacta y soporte para valores grandes. Salida en segundos, milisegundos, ISO 8601 y formato legible.

intervalos de 100 ns desde el 01-01-1601 UTC

Hora actual — Windows FILETIME
Timestamp Unix (s)

¿Qué es un FILETIME de Windows?

FILETIME es el formato de marca de tiempo usado en toda la API de Windows. Es un valor de 64 bits que cuenta el número de intervalos de 100 nanosegundos (diezmillonésimas de segundo) transcurridos desde las 00:00:00 del 1 de enero de 1601 UTC — el inicio del ciclo del calendario gregoriano que Windows usa internamente.

  • Época: 1601-01-01 00:00:00 UTC
  • Resolución: ticks de 100 nanosegundos (10.000.000 por segundo)
  • Ancho: entero sin signo de 64 bits, a menudo almacenado como dos DWORD de 32 bits (dwLowDateTime, dwHighDateTime)
  • Se ve en: tiempos de archivo NTFS, el registro de Windows, Active Directory (p. ej. lastLogonTimestamp, pwdLastSet) y registros de eventos

Cómo convertir FILETIME a una marca de tiempo Unix

Hay 11.644.473.600 segundos entre la época de FILETIME (1601) y la época Unix (1970). Divide el FILETIME entre 10.000.000 para obtener segundos y luego resta ese desfase.

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

Precisión y casos límite

Un FILETIME para un momento actual ronda 1,3 × 10^17, lo que supera el rango de enteros seguros de un número de JavaScript (2^53). Este conversor analiza el valor con BigInt para no perder precisión. La precisión por debajo del milisegundo (los últimos cuatro dígitos) se descarta al convertir a una marca de tiempo Unix en milisegundos.

  • Active Directory a veces almacena 0 o 9223372036854775807 para indicar «nunca» — son centinelas, no fechas reales
  • FILETIME siempre es UTC; aplica una zona horaria solo al mostrar el resultado
  • Las variantes de hora local (de FileTimeToLocalFileTime) ya incluyen el desfase — conviértelas primero de vuelta a UTC

Conversores de formato de marca de tiempo relacionados

Consejos prácticos de FILETIME

Algunas cosas que complican las conversiones de FILETIME en el mundo real:

  • PowerShell: [DateTime]::FromFileTimeUtc($ft) es la conversión canónica en scripts
  • Active Directory suele usar la constante 9223372036854775807 (Int64.MaxValue) para «nunca expira» — trátala como centinela, no como fecha
  • AD también usa 0 para «nunca establecido»; trata tanto 0 como Int64.MaxValue de forma especial
  • Los tiempos de archivo NTFS vienen en tres variantes: creación, última escritura, último acceso — todas usan el mismo formato FILETIME
  • Cuando FILETIME se divide en dos DWORD de 32 bits, combínalos como (high << 32) | low antes de convertir

FAQ

¿Qué es el epoch de FILETIME?
FILETIME cuenta intervalos de 100 nanosegundos desde el 1 de enero de 1601 00:00:00 UTC, la fecha base que Windows usa para el calendario gregoriano.
¿Por qué restar 11644473600 segundos?
Es el número de segundos entre el epoch FILETIME de 1601 y el epoch Unix de 1970. Dividir FILETIME entre 10 000 000 da segundos desde 1601; restar el desfase lo rebasa a 1970.
¿Cómo convierto un FILETIME almacenado como dos valores de 32 bits?
Combínalos como FILETIME = (dwHighDateTime × 4294967296) + dwLowDateTime y luego convierte ese valor de 64 bits como de costumbre.