
.NET 的 Tick(滴答)单位为 100 纳秒,1 毫秒 = 10,000 ticks;直接使用 JavaScript 数值运算可能因精度丢失导致结果异常,需确保大整数安全处理。
net 的 tick 值是自 0001-01-01 00:00:00 utc 起经过的 100 纳秒数,1 毫秒 = 10,000 ticks。javascript 中对超大整数(如 `638315425210000000`)直接进行 `+` 或 `-` 运算时,若以 number 类型存储,可能因 ieee-754 双精度浮点限制(安全整数上限为 `2^53 - 1 ≈ 9e15`)导致低有效位截断——而该 tick 值已超 `6.38e17`,远超安全范围,造成加减后时间无变化。
✅ 正确做法:使用 BigInt 或字符串安全转换
JavaScript 中处理大于 2^53 - 1 的整数必须使用 BigInt(推荐),或通过字符串解析 + BigInt 运算,避免精度损失:
const ticksPerMillisecond = 10000n; // 使用 BigInt 字面量
// 原始 tick 值(字符串形式,防止 Number 解析失真)
const startTickStr = "638315425210000000";
const endTickStr = "638338147200000000";
// 安全转换为 BigInt 并运算
const startTick = BigInt(startTickStr);
const endTick = BigInt(endTickStr);
const millisecondsAdded = startTick + ticksPerMillisecond; // +1ms
const millisecondReduced = endTick - ticksPerMillisecond; // −1ms
console.log("Original:", startTickStr, "→ +1ms →", millisecondsAdded.toString());
// 输出:638315425210000000 → +1ms → 638315425210010000
console.log("Original:", endTickStr, "→ −1ms →", millisecondReduced.toString());
// 输出:638338147200000000 → −1ms → 638338147199990000
⚠️ 关键注意事项
- ❌ 不要用
Number直接解析大 Tick 字符串:+ "638315425210000000"会转为638315425210000000,但内部二进制表示已丢失末尾精度(如...000可能变为...008或四舍五入),导致加减后时间戳未变; - ✅ 始终优先使用
BigInt:.NET Tick是精确整数,BigInt提供任意精度整数运算,完全匹配语义; - ? 验证工具需支持高精度:你使用的 TicksToDateTime 网站在部分场景下未正确处理边界 tick 值(已提 Issue),建议交叉验证:
- 使用 .NET
DateTime.FromTicks(tick)在本地运行确认; - 或用 Node.js +
date-fns/ 自定义转换函数校验;
- 使用 .NET
- ? 单位勿混淆:1 毫秒 = 10,000 ticks(非 1000),这是 .NET 时间系统的固定换算关系。
? 补充:安全的 Tick ↔ Date 转换(Node.js / 浏览器兼容)
// BigInt tick → ISO string(UTC)
function tickToISOString(tickStr) {
const tick = BigInt(tickStr);
// .NET epoch: 0001-01-01; JS epoch: 1970-01-01 → 差 62135596800 秒 = 62135596800000 ms
const netEpochMs = 62135596800000n;
const msSinceUnix = (tick / 10000n) - netEpochMs; // tick → ms, then adjust epoch
return new Date(Number(msSinceUnix)).toISOString();
}
console.log(tickToISOString("638315425210010000"));
// → "2023-09-29T00:02:01.001Z" ✅ 正确增加 1ms
综上,解决核心在于:用 BigInt 替代 Number 处理超大 Tick 值。只要运算全程保持整数精度,增减 1 毫秒(即 ±10,000 ticks)即可严格生效。










