Intl.RelativeTimeFormat 是浏览器原生国际化 API,用于将时间差自动转为本地化相对时间表达,如“3 分钟前”;需传入数值差与单位,不支持 Date 对象直接输入,现代浏览器广泛支持但 IE 不兼容。
Intl.RelativeTimeFormat 是浏览器原生支持的国际化 API,能根据用户语言和地区,自动将时间差转为自然、本地化的相对时间表达,比如中文“3 分钟前”、英文“3 minutes ago”、日文“3分前”,无需手动维护多语言词典或复杂逻辑。
它不直接接收 Date 对象,而是接收一个**数值(时间差)和单位(如 "minute", "day")**,再结合当前语言环境生成对应文本。
new Intl.RelativeTimeFormat(locales, options) 创建实例,locales 如 "zh-CN"、"en-US"、"ja-JP"
.format(value, unit),其中 value 是带符号的整数(正数表示未来,负数表示过去),unit 是 "second"、"minute"、"hour"、"day"、"week"、"month" 或 "year"
例如:
const rtf = new Intl.RelativeTimeFormat("zh-CN");实际使用中,需先算出目标时间与当前时间的差值(单位秒/分/小时/天等),再传给 format()。推荐按粒度分级判断,提升语义准确性:
"second"
"minute"
"hour"
"day"(此时可得“昨天”“前天”“明天”“后天”)Intl.DateTimeFormat 配合绝对日期显示)简单封装示例:
function formatRelativeTime(targetDate, locales = navigator.language) {Intl.RelativeTimeFormat 支持两个常用配置项:
numeric: "always"(默认)→ 总是输出数字:“1 day ago”、“2 hours ago”numeric: "auto" → 对常见值自动转为文字:“yesterday”、“tomorrow”、“next week”(中文下表现为“昨天”“明天”“下周”)style: "long"(默认)、"short"、"narrow":影响单位缩写程度,如英文中 "long" → “1 day ago”,"short" → “1 day ago”(多数语言差异不大),"narrow" 可能简化为 “1d ago”;中文基本无区别该 API 在现代浏览器中已全面支持(Chrome 71+、Firefox 70+、Safari 14.1+、Edge 79+),但不支持 IE。服务端 Node.js 需 v13.0+ 且启用 ICU 数据(通常默认开启)。
注意点:
format()
-2 和 "day",不能传 -48 和 "hour"(否则可能得到“48 小时前”,失去“两天前”的简洁语感)RelativeTimeFormat 不支持复合单位,需自行拼接或改用其他方案(如 formatDistanceToNow 来自 date-fns)