You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React项目中如何将Gregorian ticks时间戳转为JS可读格式?

解决18位Gregorian Ticks时间戳转可读格式问题

核心原理

你遇到的18位时间戳是Gregorian Ticks,每个tick代表100纳秒,起始点是公元1年1月1日00:00:00.000。要在React/JavaScript中转换,关键是把它映射到JS原生Date对象基于1970年的毫秒时间戳上。

转换工具函数(React/JavaScript)

由于18位数值超出了JSNumber的安全精度范围,必须用BigInt处理,避免精度丢失:

function convertGregorianTicksToDate(ticksStr) {
  // 公元1年到1970年UTC的ticks偏移量(固定值)
  const epochOffset = BigInt('621355968000000000');
  const ticks = BigInt(ticksStr);
  
  // 计算1970年以来的毫秒数:每个tick=100纳秒,1毫秒=10000个ticks
  const msSinceEpoch = (ticks - epochOffset) / BigInt(10000);
  
  // 转换为Date对象
  return new Date(Number(msSinceEpoch));
}

// 测试你的示例
const startTime = "637703442050000000";
const targetDate = convertGregorianTicksToDate(startTime);
// 输出对应东八区时间(匹配示例的2021-10-20 16:30:05)
console.log(targetDate.toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' }));
// 输出ISO格式UTC时间
console.log(targetDate.toISOString());

计算事件时长

拿到转换后的Date对象后,直接通过时间戳差值计算时长:

function calculateEventDuration(startTicks, endTicks) {
  const startDate = convertGregorianTicksToDate(startTicks);
  const endDate = convertGregorianTicksToDate(endTicks);
  
  const diffMs = endDate.getTime() - startDate.getTime();
  
  // 转换为时分秒格式
  const hours = Math.floor(diffMs / (1000 * 60 * 60));
  const minutes = Math.floor((diffMs % (1000 * 60 * 60)) / (1000 * 60));
  const seconds = Math.floor((diffMs % (1000 * 60)) / 1000);
  
  return `${hours}小时${minutes}分钟${seconds}秒`;
}

注意事项

  • 时区:Date对象默认使用本地时区,若需要和示例的2021-10-20 16:30:05完全匹配,需在toLocaleString中指定对应时区(如Asia/Shanghai)。
  • 精度:必须用BigInt处理原始ticks字符串,直接转Number会导致精度丢失,转换结果错误。

内容的提问来源于stack exchange,提问作者Patrick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:46:57