.NET Ticks Converter

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