.NET 的 DateTime ticks 是从 0001-01-01T00:00:00 起算的 100 纳秒间隔数。只有当它的源纪元和单位一起传递时,这个数才有意义——数字本身不会告诉你它属于哪块钟。
换算公式
Unix 毫秒 = ticks / 10000 − 62135596800000
转换器按这个关系给出 Unix 秒、epoch 毫秒、ISO 8601 UTC 和可读的 UTC 值。排查日志或导出数据时,请把原始值也留着,方便日后复核换算是否正确。
容易出错的地方
这个数字太大,超出了 JavaScript Number 的安全运算范围。请用 BigInt 来转换 tick 值,才能保住低位数字。
更稳妥的做法
- 动手算之前,先确认平台和字段名。
- 数值可能超出 JavaScript 安全整数范围时,用字符串保留原始值。
- 在边界上一次性转换完,之后只存储和比较单位明确的 Unix 值。
- 只有在把结果呈现给人看时,才用具名时区做格式化。
相关格式转换器
Frequent questions:
- Q: 一秒有多少个 tick?
- A: 正好 10,000,000 个——每个 tick 是 100 纳秒。
- Q: .NET ticks 和 Windows FILETIME 有什么区别?
- A: 两者的单位都是 100 纳秒,但 .NET ticks 从 0001-01-01 起算,FILETIME 从 1601-01-01 起算,两者相差固定的 504,911,232,000,000,000 个 tick。
- Q: C# 里怎么从 DateTime 拿到 Unix 时间?
- A: 用 new DateTimeOffset(dateTime.ToUniversalTime()).ToUnixTimeSeconds() 或 .ToUnixTimeMilliseconds()。