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