A Windows FILETIME value is a count of 100-nanosecond intervals from 1601-01-01T00:00:00Z. It is useful only when its source epoch and unit travel with it; the number by itself does not announce which clock it belongs to.

Conversion rule

Unix milliseconds = FILETIME / 10000 − 11644473600000

The converter applies that relationship and returns Unix seconds, epoch milliseconds, ISO 8601 UTC, and a readable UTC value. Keep the original value as well when investigating a log or export so the conversion can be checked later.

Where mistakes happen

FILETIME values exceed JavaScript's safe-integer range. Keep the source value as a BigInt or string until conversion.

A safer workflow

  • Identify the platform and field name before doing arithmetic.
  • Preserve the original value as a string when it may exceed JavaScript safe-integer precision.
  • Convert once at the boundary, then store or compare a declared Unix unit.
  • Format in a named timezone only when presenting the resulting instant to a person.

Frequent questions:

Q: What is the FILETIME epoch?
A: FILETIME counts 100-nanosecond intervals since January 1, 1601 00:00:00 UTC, the base date Windows uses for the Gregorian calendar.
Q: Why subtract 11644473600 seconds?
A: 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.
Q: How do I convert a FILETIME stored as two 32-bit values?
A: Combine them as FILETIME = (dwHighDateTime × 4294967296) + dwLowDateTime, then convert that 64-bit value as usual.