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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:57:02