
.NET 的 Tick 时间戳以 100 纳秒为单位,增减 1 毫秒需加减 10000 个 tick;但直接使用大整数运算可能因 JavaScript 数字精度限制(Number.MAX_SAFE_INTEGER = 9007199254740991)导致错误,必须谨慎处理。
net 的 tick 时间戳以 100 纳秒为单位,增减 1 毫秒需加减 10000 个 tick;但直接使用大整数运算可能因 javascript 数字精度限制(`number.max_safe_integer = 9007199254740991`)导致错误,必须谨慎处理。
在 JavaScript 中操作 .NET Tick 值(如 638315425210000000)时,看似简单的 +10000 运算,实际可能失效——根本原因在于 JavaScript 的 Number 类型无法安全表示超过 2^53 − 1(即 9007199254740991)的整数。而典型的 .NET Tick 值(如 638315425210000000 ≈ 6.38×10¹⁷)远超该上限,此时整数精度丢失,导致 +10000 后数值未发生有效变化(例如 638315425210000000 + 10000 在 JS 中仍显示为 638315425210000000 或四舍五入为 638315425210010000,但在线转换工具因内部解析逻辑差异可能无法识别微小变动)。
✅ 正确做法是:始终将 Tick 字符串作为字符串处理,并借助 BigInt 进行高精度整数运算(现代浏览器及 Node.js ≥ v10.4.0 均支持):
const ticksPerMillisecond = 10000n; // BigInt literal
// 原始 tick 值(务必用字符串传入,避免 Number 解析失真)
const startTickStr = "638315425210000000";
const endTickStr = "638338147200000000";
// 安全加/减 1 毫秒(10000 ticks)
const millisecondsAdded = (BigInt(startTickStr) + ticksPerMillisecond).toString();
const millisecondReduced = (BigInt(endTickStr) - ticksPerMillisecond).toString();
console.log("Original:", startTickStr); // "638315425210000000"
console.log("After +1ms:", millisecondsAdded); // "638315425210010000"
console.log("After -1ms:", millisecondReduced); // "638338147199990000"
⚠️ 注意事项:
- ❌ 避免
+tickString或parseInt(tickString)—— 会强制转为Number,触发精度截断; - ✅ 始终用字符串初始化
BigInt(...),否则BigInt(638315425210000000)仍基于已失真的Number值构造; - ? 验证工具兼容性:TicksToDateTime 当前存在显示精度缺陷(如无法区分
...000000与...010000),建议交叉验证:将结果用new Date(Number(BigInt(tickStr)/10000n))转为 JSDate对象,或使用 dotnetfiddle 运行 C# 代码确认; - ? 补充知识:1 tick = 100 纳秒 = 0.0001 毫秒;故 1 毫秒 = 10,000 ticks(恒定换算关系,与起始时间无关)。
总结:Tick 运算不是普通算术,而是高精度整数运算。坚持「字符串输入 → BigInt 计算 → 字符串输出」三步法,即可可靠实现毫秒级增减,彻底规避 JavaScript 数值精度陷阱。










