Windows FILETIME 是从 1601-01-01T00:00:00Z 起算的 100 纳秒间隔数。只有当它的源纪元和单位一起传递时,这个数才有意义——数字本身不会告诉你它属于哪块钟。

换算公式

Unix 毫秒 = FILETIME / 10000 − 11644473600000

转换器按这个关系给出 Unix 秒、epoch 毫秒、ISO 8601 UTC 和可读的 UTC 值。排查日志或导出数据时,请把原始值也留着,方便日后复核换算是否正确。

容易出错的地方

FILETIME 的数值超出了 JavaScript 的安全整数范围。转换之前,请把源值保留为 BigInt 或字符串。

更稳妥的做法

  • 动手算之前,先确认平台和字段名。
  • 数值可能超出 JavaScript 安全整数范围时,用字符串保留原始值。
  • 在边界上一次性转换完,之后只存储和比较单位明确的 Unix 值。
  • 只有在把结果呈现给人看时,才用具名时区做格式化。

相关格式转换器

Frequent questions:

Q: FILETIME 的纪元是什么?
A: FILETIME 计的是自 1601 年 1 月 1 日 00:00:00 UTC 起的 100 纳秒间隔数,这是 Windows 为格里高利历选定的基准日期。
Q: 为什么要减去 11644473600 秒?
A: 这是 1601 年的 FILETIME 纪元到 1970 年 Unix 纪元之间的秒数。把 FILETIME 除以 10,000,000 得到自 1601 年以来的秒数,再减掉这个偏移,就把基准挪到了 1970 年。
Q: FILETIME 被存成两个 32 位值时怎么转?
A: 先合并:FILETIME = (dwHighDateTime × 4294967296) + dwLowDateTime,再按常规方式转换这个 64 位值。