Intl.RelativeTimeFormat 可生成“3分钟前”等本地化字符串,但需手动计算整数差值并指定单位,不支持 Date 或时间戳;中文下 style: "short" 无效,缩写需自行映射。

Intl.RelativeTimeFormat 能直接生成“3分钟前”“昨天”“2个月后”这类本地化字符串,但默认不支持自动刷新、不处理时间戳类型、且单位粒度由浏览器决定——你得自己控制输入格式和更新逻辑。
传入的数值必须是整数,且单位要和 style 匹配
这个 API 不接受 Date 对象或毫秒时间戳,只认数字 + 显式单位("second"、"minute" 等)。常见错误是直接传 new Date().getTime(),结果得到一串科学计数法加单位的诡异输出。
- 正确做法:先算差值(单位为“秒”或“分钟”),再向下取整,传给
format() - 例如想显示“3分钟前”,需计算
Math.floor((now - targetTime) / 60000),然后调用formatter.format(-3, "minute") - 单位选错会导致语义错乱:传
-180却用"second",会输出“-180秒前”,而不是“3分钟前”
中文环境默认不缩写,“分钟前”不会变成“分前”
Intl.RelativeTimeFormat("zh-CN", { style: "short" }) 对中文无效——style: "short" 只影响部分语言(如英文的 "3 mins ago"),中文始终输出完整词,比如“3分钟前”“昨天”“明年”。想压缩字数只能自己映射:
const shortMap = {
"second": "秒",
"minute": "分",
"hour": "小时",
"day": "天",
"week": "周",
"month": "月",
"year": "年"
};
// 再拼接:`${value}${shortMap[unit]}${value < 0 ? "前" : "后"}`
不能自动响应时间推移,需手动触发重渲染
Intl.RelativeTimeFormat 是纯函数式 API,没有任何定时或监听机制。页面上显示“3分钟前”,59秒后它还是“3分钟前”,除非你主动重新调用 format()。
- 简单场景:用
setInterval每 30 秒重算一次,但注意避免内存泄漏(组件卸载时清除定时器) - React 中推荐封装成自定义 Hook,依赖
useEffect和useRef管理定时器 - 高频更新(如倒计时)别用
"second"单位——中文下每秒渲染一次,视觉跳动明显,建议降到分钟级或加防抖
最易被忽略的是时区处理:所有计算都基于本地时区,如果服务端返回的是 UTC 时间戳,必须先用 new Date(utcTimestamp).getTime() 转成本地毫秒数再算差值,否则跨时区用户看到的“刚刚”可能是服务器时间的“刚刚”,而非他们手机上的“刚刚”。

















