FILETIME Converter

Conversor de Windows FILETIME para timestamp Unix

Converta Windows FILETIME em tempo Unix com a fórmula exata e suporte para valores grandes. Saída em segundos, milissegundos, ISO 8601 e formato legível.

intervalos de 100 ns desde 01-01-1601 UTC

Hora atual — Windows FILETIME
Timestamp Unix (s)

O que é um FILETIME do Windows?

FILETIME é o formato de marca de tempo usado em toda a API do Windows. É um valor de 64 bits que conta o número de intervalos de 100 nanossegundos (décimos de milionésimo de segundo) decorridos desde 00:00:00 de 1º de janeiro de 1601 UTC — o início do ciclo do calendário gregoriano que o Windows usa internamente.

  • Época: 1601-01-01 00:00:00 UTC
  • Resolução: ticks de 100 nanossegundos (10.000.000 por segundo)
  • Largura: inteiro sem sinal de 64 bits, frequentemente armazenado como dois DWORDs de 32 bits (dwLowDateTime, dwHighDateTime)
  • Visto em: tempos de arquivo NTFS, o registro do Windows, Active Directory (ex.: lastLogonTimestamp, pwdLastSet) e logs de eventos

Como converter FILETIME em uma marca de tempo Unix

Há 11.644.473.600 segundos entre a época do FILETIME (1601) e a época Unix (1970). Divida o FILETIME por 10.000.000 para obter segundos e depois subtraia esse deslocamento.

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

Precisão e casos extremos

Um FILETIME para um momento atual gira em torno de 1,3 × 10^17, o que excede o intervalo de inteiros seguros de um número JavaScript (2^53). Este conversor analisa o valor com BigInt para não perder precisão. A precisão abaixo do milissegundo (os últimos quatro dígitos) é descartada ao converter para uma marca de tempo Unix em milissegundos.

  • O Active Directory às vezes armazena 0 ou 9223372036854775807 para significar «nunca» — são sentinelas, não datas reais
  • FILETIME é sempre UTC; aplique um fuso horário apenas ao exibir o resultado
  • Variantes de hora local (de FileTimeToLocalFileTime) já incluem o deslocamento — converta-as de volta para UTC primeiro

Conversores de formato de marca de tempo relacionados

Dicas práticas de FILETIME

Algumas coisas que atrapalham as conversões de FILETIME no mundo real:

  • PowerShell: [DateTime]::FromFileTimeUtc($ft) é a conversão canônica em scripts
  • O Active Directory costuma usar a constante 9223372036854775807 (Int64.MaxValue) para «nunca expira» — trate como sentinela, não como data
  • O AD também usa 0 para «nunca definido»; trate tanto 0 quanto Int64.MaxValue de forma especial
  • Os tempos de arquivo NTFS vêm em três variantes: criação, última gravação, último acesso — todas usam o mesmo formato FILETIME
  • Quando o FILETIME é dividido em dois DWORDs de 32 bits, combine como (high << 32) | low antes de converter

FAQ

O que é o epoch do FILETIME?
O FILETIME conta intervalos de 100 nanossegundos desde 1º de janeiro de 1601 00:00:00 UTC, a data base que o Windows usa para o calendário gregoriano.
Por que subtrair 11644473600 segundos?
É o número de segundos entre o epoch FILETIME de 1601 e o epoch Unix de 1970. Dividir o FILETIME por 10.000.000 dá segundos desde 1601; subtrair o deslocamento rebaseia para 1970.
Como converto um FILETIME armazenado como dois valores de 32 bits?
Combine-os como FILETIME = (dwHighDateTime × 4294967296) + dwLowDateTime e depois converta esse valor de 64 bits como de costume.