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

网站中如何基于UTC的ISO8601时间显示已过时长(hh:mm格式)

没问题,我来给你讲清楚怎么实现这个「已过时长」计数器,用前端常用的JavaScript就能轻松搞定👇

核心思路

我们需要从API返回的UTC时间出发,计算它到当前UTC时间的时间差,再把差值格式化为hh:mm的形式——全程用UTC时间计算,避免用户本地时区干扰,保证时长准确。

分步实现

1. 解析UTC时间字符串

API返回的"created_at": "2018-05-16T14:00:00Z"是标准ISO 8601格式的UTC时间,直接用new Date()就能正确解析成UTC时间对象:

const createdAtStr = "2018-05-16T14:00:00Z";
const createdAt = new Date(createdAtStr);

2. 计算时间差

获取当前的UTC时间(用Date.now()确保是UTC时间戳),然后计算两个时间的毫秒差值:

const nowUtc = new Date(Date.now()); // 当前UTC时间
const diffMs = nowUtc - createdAt; // 已过的毫秒数

注意:如果API返回的时间在当前时间之后(比如测试场景),可以加个判断返回"00:00"避免出现负数时长。

3. 转换为小时和分钟

把毫秒差值转换成总分钟数,再拆分出小时和剩余分钟:

const totalMinutes = Math.floor(diffMs / (1000 * 60)); // 向下取整,避免小数分钟
const hours = Math.floor(totalMinutes / 60);
const minutes = totalMinutes % 60;

4. 格式化为hh:mm

确保小时和分钟都是两位数,不足的话补前导0:

// ES6方法,简洁直观
const formattedHours = hours.toString().padStart(2, '0');
const formattedMinutes = minutes.toString().padStart(2, '0');
const elapsedTime = `${formattedHours}:${formattedMinutes}`;

如果需要兼容旧浏览器,可以自己写个补0函数替代padStart:

function padZero(num) {
  return num < 10 ? `0${num}` : num.toString();
}
// 替换成:
const formattedHours = padZero(hours);
const formattedMinutes = padZero(minutes);
完整可复用函数

把上面的逻辑封装成函数,方便随时调用:

function getElapsedTime(createdAtStr) {
  const createdAt = new Date(createdAtStr);
  const nowUtc = new Date(Date.now());
  const diffMs = nowUtc - createdAt;

  // 处理时间在未来的情况
  if (diffMs < 0) {
    return "00:00";
  }

  const totalMinutes = Math.floor(diffMs / (1000 * 60));
  const hours = Math.floor(totalMinutes / 60);
  const minutes = totalMinutes % 60;

  // 补0格式化
  const padZero = num => num < 10 ? `0${num}` : num.toString();
  return `${padZero(hours)}:${padZero(minutes)}`;
}

// 调用示例
console.log(getElapsedTime("2018-05-16T14:00:00Z"));
实时更新计数器(可选)

如果需要让计数器每秒自动刷新,用setInterval定时更新DOM即可:

// 假设页面上有个id为elapsed-counter的元素用来显示时长
function updateCounter() {
  const elapsed = getElapsedTime("2018-05-16T14:00:00Z");
  document.getElementById('elapsed-counter').textContent = elapsed;
}

// 初始化显示
updateCounter();
// 每秒刷新一次
setInterval(updateCounter, 1000);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:06:07