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

GitHub仓库更新时间差的最优计算实现方案咨询

GitHub仓库更新时间差的最优计算实现方案咨询

你这个需求其实很常见,就是把GitHub API返回的ISO格式更新时间转换成友好的相对时间戳,你现在的思路已经抓对了核心逻辑——通过时间差判断所属的时间区间,不过可以从几个方向优化,让代码更简洁、易维护,还能补上单复数这类细节:

现有代码可以优化的点

  • 魔法数字可读性差:直接写3600、86400这类数字,后续维护时得反应半天对应的是小时还是天;
  • 缺少单复数处理:比如现在会输出1 days,不符合日常用语习惯;
  • 多层if-else冗余:逻辑多了之后会变得臃肿,后续加新的时间单位(比如“星期”)会很麻烦。

优化后的实现方案

我们可以把时间区间做成配置数组,封装成可复用的函数,同时处理单复数问题:

// 定义时间区间配置:阈值(秒)+ 单位文本
const TIME_UNITS = [
  { threshold: 31536000, unit: 'year' },   // 1年
  { threshold: 2592000, unit: 'month' },   // 30天近似1个月
  { threshold: 86400, unit: 'day' },       // 1天
  { threshold: 3600, unit: 'hour' },       // 1小时
  { threshold: 60, unit: 'minute' },       // 1分钟
];

function getRelativeUpdateTime(isoTime) {
  const updatedDate = new Date(isoTime);
  const now = new Date();
  const diffSeconds = Math.floor((now.getTime() - updatedDate.getTime()) / 1000);

  // 处理小于1分钟的情况
  if (diffSeconds < 60) {
    return 'just now';
  }

  // 遍历配置数组,找到匹配的时间单位
  for (const { threshold, unit } of TIME_UNITS) {
    const count = Math.floor(diffSeconds / threshold);
    if (count >= 1) {
      // 自动处理单复数:数量>1时加s
      return `${count} ${unit}${count > 1 ? 's' : ''} ago`;
    }
  }

  // 兜底逻辑(理论上不会走到这里)
  return 'just now';
}

// 用法示例:传入GitHub返回的updated_at字符串
console.log(getRelativeUpdateTime("2024-02-09T10:17:53Z"));

这个方案的优势

  • 可读性强:常量和配置数组一眼就能看懂每个时间区间对应的单位;
  • 易扩展:如果要加“星期”这类单位,直接在TIME_UNITS里加一行配置就行;
  • 细节完善:自动处理单复数,输出更符合日常阅读习惯;
  • 复用性高:封装成函数后,在页面任何需要显示相对时间的地方直接调用即可。

另外补充个小细节:GitHub返回的updated_at是UTC时间,但我们用Date对象计算时间差时,now和updatedDate都会统一转换成时间戳(毫秒数),所以时区差异不会影响计算结果,完全没问题。

备注:内容来源于stack exchange,提问作者Sakshi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 06:28:14