JavaScript计算当前时间与Unix时间戳差值实现相对时间展示的方法
正确实现时间戳转相对时间格式的方案
错误原因说明
你之前的实现出现问题有两个核心原因:
Date.now()返回的是13位毫秒级时间戳,和你从数据库拿到的createdAt时间戳的差值单位已经是毫秒,你额外乘1000会把数值放大1000倍,时间计算完全偏离实际差值- 直接用时间差值初始化
Date对象后调用getHours(),拿到的是1970年基准时间加上差值后的时区校正小时值,不是两个时间的实际小时差,自然不符合预期
完整实现代码
function formatRelativeTime(timestamp) { // 兼容字符串格式的时间戳,统一转数字 const targetTime = Number(timestamp) const diffMs = Date.now() - targetTime // 兼容未来时间的场景 if (diffMs < 0) return 'in the future' // 小于1秒统一返回刚刚 if (diffMs < 1000) return 'just now' // 按从大到小顺序定义时间单位和对应的毫秒数 const units = [ { name: 'year', ms: 365 * 24 * 60 * 60 * 1000 }, { name: 'week', ms: 7 * 24 * 60 * 60 * 1000 }, { name: 'day', ms: 24 * 60 * 60 * 1000 }, { name: 'hour', ms: 60 * 60 * 1000 }, { name: 'min', ms: 60 * 1000 }, { name: 'sec', ms: 1000 } ] // 匹配最符合的大单位输出 for (const unit of units) { const count = Math.floor(diffMs / unit.ms) if (count >= 1) { return `${count} ${unit.name}${count > 1 ? 's' : ''} ago` } } } // 调用示例,直接传入从数据库拿到的createdAt即可 const dbRes = { createdAt: "1634413505432" } console.log(formatRelativeTime(dbRes.createdAt))
补充说明
- 如果需要使用中文单位,直接修改
units数组中name字段的值,同时去掉后面的复数s判断即可 - 如果你的时间戳是10位的秒级时间戳,需要先乘以1000转成毫秒级再传入函数使用
内容的提问来源于stack exchange,提问作者crispengari
相关产品推荐
相关产品推荐

