如何解析并处理带微秒的日期时间,实现高精度时间差计算?
实现微秒级精度的日期时间差值计算
你需要计算带6位微秒的日期时间字符串差值,现有库仅支持毫秒精度无法满足需求,下面是纯JavaScript的实现方案:
实现思路
- 解析日期到微秒级时间戳:将
YYYY-MM-DD HH:MM:SS.SSSSSS格式的字符串拆解为年、月、日、时、分、秒、微秒,转换为以微秒为单位的总时间数,避开Date对象仅支持毫秒精度的限制。 - 计算差值并格式化:计算两个时间戳的差值,再将差值转换为你需要的
±0000-00-00 00-00-00.000000格式。
完整代码
// 解析日期字符串为微秒级时间戳 function parseToMicroseconds(dateStr) { const [datePart, timePart] = dateStr.split(' '); const [year, month, day] = datePart.split('-').map(Number); const [timeMain, microSecStr] = timePart.split('.'); const [hour, minute, second] = timeMain.split(':').map(Number); // 确保微秒部分为6位,不足补0 const microseconds = parseInt(microSecStr.padEnd(6, '0').slice(0, 6), 10); // 计算UTC毫秒数,再转换为微秒,加上剩余微秒 const msTimestamp = Date.UTC(year, month - 1, day, hour, minute, second, Math.floor(microseconds / 1000)); return msTimestamp * 1000 + (microseconds % 1000); } // 将微秒差值格式化为指定字符串 function formatMicrosecondsDiff(diffMicro) { const isNegative = diffMicro < 0; const absDiff = Math.abs(diffMicro); // 计算时间差的各分量 const days = Math.floor(absDiff / (1000 * 1000 * 60 * 60 * 24)); let remaining = absDiff % (1000 * 1000 * 60 * 60 * 24); const hours = Math.floor(remaining / (1000 * 1000 * 60 * 60)); remaining %= (1000 * 1000 * 60 * 60); const minutes = Math.floor(remaining / (1000 * 1000 * 60)); remaining %= (1000 * 1000 * 60); const seconds = Math.floor(remaining / (1000 * 1000)); remaining %= (1000 * 1000); const microseconds = remaining; // 格式化各部分为固定长度 const formatNum = (num, len) => num.toString().padStart(len, '0'); const formatted = `${isNegative ? '-' : ''}0000-${formatNum(0, 2)}-${formatNum(days, 2)} ${formatNum(hours, 2)}-${formatNum(minutes, 2)}-${formatNum(seconds, 2)}.${formatNum(microseconds, 6)}`; return formatted; } // 核心差值计算函数 function subtractDates(date1, date2) { const micro1 = parseToMicroseconds(date1); const micro2 = parseToMicroseconds(date2); return formatMicrosecondsDiff(micro1 - micro2); }
测试示例
const d1 = '2022-07-03 03:45:15.679570'; const d2 = '2022-07-03 03:45:15.679638'; console.log(subtractDates(d1, d2)); // 输出:-0000-00-00 00-00-00.000068 console.log(subtractDates(d2, d1)); // 输出:0000-00-00 00-00-00.000068 // 跨天测试 const d3 = '2022-07-03 23:59:59.999999'; const d4 = '2022-07-04 00:00:00.000001'; console.log(subtractDates(d3, d4)); // 输出:-0000-00-01 00-00-00.000002
说明
- 纯JavaScript实现,无需依赖任何外部库,完全支持6位微秒精度计算。
- 处理了日期字符串的微秒部分补0逻辑,确保解析精度。
- 支持跨天、跨月、跨年的时间差计算,格式输出符合需求。
内容的提问来源于stack exchange,提问作者Dorki
相关产品推荐
相关产品推荐

