Windows FILETIME to Unix Timestamp Converter

Paste a Windows FILETIME value and convert it to a Unix timestamp (seconds and milliseconds), ISO 8601, and a human-readable date in any timezone. FILETIME counts 100-nanosecond intervals since January 1, 1601 UTC.

What is a Windows FILETIME?

FILETIME is the timestamp format used throughout the Windows API. It is a 64-bit value counting the number of 100-nanosecond intervals (ten-millionths of a second) that have elapsed since 00:00:00 on January 1, 1601 UTC — the start of the Gregorian calendar cycle Windows uses internally.

  • Epoch: 1601-01-01 00:00:00 UTC
  • Resolution: 100-nanosecond ticks (10,000,000 per second)
  • Width: 64-bit unsigned integer, often stored as two 32-bit DWORDs (dwLowDateTime, dwHighDateTime)
  • Seen in: NTFS file times, the Windows registry, Active Directory (e.g. lastLogonTimestamp, pwdLastSet), and event logs

How to convert FILETIME to a Unix timestamp

There are 11,644,473,600 seconds between the FILETIME epoch (1601) and the Unix epoch (1970). Divide the FILETIME by 10,000,000 to get seconds, then subtract that offset.

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

Precision and edge cases

A FILETIME for a present-day moment is roughly 1.3 × 10^17, which exceeds the safe integer range of a JavaScript number (2^53). This converter parses the value with BigInt so no precision is lost. Sub-millisecond precision (the last four digits) is dropped when converting to a millisecond Unix timestamp.

  • Active Directory sometimes stores 0 or 9223372036854775807 to mean "never" — these are sentinels, not real dates
  • FILETIME is always UTC; apply a timezone only when displaying the result
  • Local-time variants (from FileTimeToLocalFileTime) already include the offset — convert those back to UTC first
What is the FILETIME epoch?
FILETIME counts 100-nanosecond intervals since January 1, 1601 00:00:00 UTC, the base date Windows uses for the Gregorian calendar.
Why subtract 11644473600 seconds?
That is the number of seconds between the 1601 FILETIME epoch and the 1970 Unix epoch. Dividing FILETIME by 10,000,000 gives seconds since 1601; subtracting the offset rebases it to 1970.
How do I convert a FILETIME stored as two 32-bit values?
Combine them as FILETIME = (dwHighDateTime × 4294967296) + dwLowDateTime, then convert that 64-bit value as usual.

Related timestamp format converters