Windows FILETIME 轉 Unix 時間戳轉換器
把 Windows FILETIME 轉換為 Unix 時間。精確公式與大數支援。輸出:秒、毫秒、ISO 8601 與可讀格式。
自 1601-01-01 UTC 以來的 100 奈秒間隔數
目前時間 — Windows FILETIME—
Unix 時間戳(秒)—
什麼是 Windows FILETIME?
FILETIME 是整個 Windows API 中使用的時間戳記格式。它是一個 64 位值,記錄自 1601 年 1 月 1 日 00:00:00 UTC(Windows 內部使用的格里曆週期起點)以來經過的 100 奈秒間隔(千萬分之一秒)的數量。
- 紀元:1601-01-01 00:00:00 UTC
- 解析度:100 奈秒刻度(每秒 10,000,000)
- 寬度:64 位無號整數,常以兩個 32 位 DWORD 儲存(dwLowDateTime、dwHighDateTime)
- 常見於:NTFS 檔案時間、Windows 登錄、Active Directory(如 lastLogonTimestamp、pwdLastSet)以及事件日誌
如何將 FILETIME 轉換為 Unix 時間戳記
FILETIME 紀元(1601)與 Unix 紀元(1970)之間相差 11,644,473,600 秒。把 FILETIME 除以 10,000,000 得到秒,再減去這個偏移。
- Unix seconds = FILETIME / 10000000 − 11644473600
- Unix milliseconds = FILETIME / 10000 − 11644473600000
- 範例:133444736000000000 → 1700000000 秒 → 2023-11-14 22:13:20 UTC
- 反向:FILETIME = (Unix milliseconds + 11644473600000) × 10000
精度與邊界情形
目前時刻的 FILETIME 約為 1.3 × 10^17,超過了 JavaScript 數字的安全整數範圍(2^53)。本轉換器用 BigInt 解析該值,因此不會遺失精度。次毫秒精度(最後四位)在轉換為毫秒 Unix 時間戳記時會被捨棄。
- Active Directory 有時儲存 0 或 9223372036854775807 表示「從不」——它們是哨兵值,不是真實日期
- FILETIME 始終是 UTC;僅在顯示結果時才套用時區
- 本地時間變體(來自 FileTimeToLocalFileTime)已包含偏移——請先將其轉換回 UTC
相關時間戳記格式轉換器
FILETIME 實用提示
現實中 FILETIME 轉換容易踩到的幾點:
- PowerShell:[DateTime]::FromFileTimeUtc($ft) 是指令稿中的標準轉換
- Active Directory 常用常數 9223372036854775807(Int64.MaxValue)表示「永不過期」——按哨兵值處理,而非日期
- AD 還用 0 表示「從未設定」;對 0 和 Int64.MaxValue 都要特殊處理
- NTFS 檔案時間有三種:建立、最後寫入、最後存取——都使用相同的 FILETIME 格式
- 當 FILETIME 被拆成兩個 32 位 DWORD 時,轉換前先按 (high << 32) | low 合併
FAQ
- 什麼是 FILETIME 紀元?
- FILETIME 計數自 1601 年 1 月 1 日 00:00:00 UTC 以來的 100 奈秒間隔,這是 Windows 用於公曆的基準日期。
- 為什麼要減去 11644473600 秒?
- 這是 1601 年 FILETIME 紀元與 1970 年 Unix 紀元之間的秒數。把 FILETIME 除以 10,000,000 得到自 1601 年起的秒數;減去該偏移即把基準移到 1970 年。
- 如何轉換以兩個 32 位值儲存的 FILETIME?
- 按 FILETIME = (dwHighDateTime × 4294967296) + dwLowDateTime 組合它們,然後照常轉換這個 64 位值。