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
相关产品推荐
相关产品推荐

