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

如何解析并处理带微秒的日期时间,实现高精度时间差计算?

实现微秒级精度的日期时间差值计算

你需要计算带6位微秒的日期时间字符串差值,现有库仅支持毫秒精度无法满足需求,下面是纯JavaScript的实现方案:

实现思路

  1. 解析日期到微秒级时间戳:将YYYY-MM-DD HH:MM:SS.SSSSSS格式的字符串拆解为年、月、日、时、分、秒、微秒,转换为以微秒为单位的总时间数,避开Date对象仅支持毫秒精度的限制。
  2. 计算差值并格式化:计算两个时间戳的差值,再将差值转换为你需要的±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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:19:23