.NET Ticks 轉 Unix 時間戳轉換器
把 .NET Ticks 轉換為 Unix 時間。精確公式與大數支援。輸出:秒、毫秒、ISO 8601 與可讀格式。
自 0001-01-01 以來的 100 奈秒間隔數
目前時間 — .NET DateTime.Ticks—
Unix 時間戳(秒)—
什麼是 .NET ticks?
在 .NET 中,DateTime.Ticks 和 TimeSpan.Ticks 以 100 奈秒為單位度量時間。DateTime 的 tick 計數是自先發格里曆 0001 年 1 月 1 日 00:00:00 以來的 100 奈秒間隔數量。
- 紀元:0001-01-01 00:00:00
- 解析度:100 奈秒刻度(每秒 10,000,000)
- 目前值約為 6.4 × 10^17
- C#: DateTime.UtcNow.Ticks, DateTimeOffset.UtcNow.Ticks
如何將 .NET ticks 轉換為 Unix 時間戳記
0001-01-01 與 1970-01-01 之間相差 62,135,596,800 秒。把 ticks 除以 10,000,000 得到自西元 1 年起的秒,再減去這個偏移。
- Unix seconds = Ticks / 10000000 − 62135596800
- Unix milliseconds = Ticks / 10000 − 62135596800000
- 範例:638355968000000000 → 1700000000 → 2023-11-14 22:13:20 UTC
- 在 C# 中:new DateTimeOffset(dt).ToUnixTimeSeconds() 會替你完成
C# 程式碼與邊界情形
現代 .NET 提供 DateTimeOffset.ToUnixTimeSeconds() 和 ToUnixTimeMilliseconds(),以及反向的 DateTimeOffset.FromUnixTimeSeconds()。僅在與序列化資料互通時才直接使用 ticks。注意 DateTime.Ticks 會忽略 DateTimeKind,所以務必先正規化為 UTC。
- C#: var unixSeconds = new DateTimeOffset(dt.ToUniversalTime()).ToUnixTimeSeconds();
- C#: var dt = DateTimeOffset.FromUnixTimeMilliseconds(ms).UtcDateTime;
- ticks 為 0 = 0001-01-01;DateTime.MaxValue.Ticks = 3155378975999999999
- 這些值超過 JavaScript 安全整數,因此本轉換器使用 BigInt
相關時間戳記格式轉換器
函式庫與序列化注意事項
ticks 會出現在較舊的 .NET 序列化格式和 JSON 慣例中。請注意:
- 舊版 Microsoft JSON 日期:"/Date(1700000000000+0000)/" 包裹的是毫秒(不是 ticks)
- DateTimeOffset.UnixEpoch 是現代 .NET 中標準的零點
- DateTime.MaxValue.Ticks = 3155378975999999999;如此高的值幾乎肯定表示「從不」哨兵值
- TimeSpan.Ticks 是相同單位但作為時長度量;不要盲目地用 TimeSpan tick 去減 DateTime tick
- Newtonsoft.Json 和 System.Text.Json 都預設使用 ISO 8601——在可選時優先用它而非原始 ticks
FAQ
- 一秒有多少個 tick?
- 正好 10,000,000 個 tick——每個 tick 是 100 奈秒。
- .NET tick 與 Windows FILETIME 有什麼區別?
- 兩者都使用 100 奈秒單位,但 .NET tick 從 0001-01-01 開始計數,而 FILETIME 從 1601-01-01 開始計數。兩者相差固定偏移 504,911,232,000,000,000 個 tick。
- 如何從 C# 的 DateTime 取得 Unix 時間?
- 使用 new DateTimeOffset(dateTime.ToUniversalTime()).ToUnixTimeSeconds() 或 .ToUnixTimeMilliseconds()。