.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()。