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.
Related format converters
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.