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

