本文介绍一个2018标准的WEB API - Intl.RelativeTimeFormat,此API属于Intl
对象,可以很方便和人性化的格式化时间的展示,特别是在要做国际化的站点上,尤其适用。
不过此API目前默认情况下只在V8 v7.1.179和Chrome 71中可用,不过你可以尝尝鲜。
现代Web应用程序通常使用“昨天”,“42秒前”或“3个月”之类的短语,而不是完整日期和时间戳。这种 相对时间格式 已经变得如此普遍,以至于几个流行的库(包括Moment.js, Globalize和date-fns都实现了按本地习惯格式化时间这样的功能。
实现本地化相对时间格式化的一个问题是,您需要为要支持的每种语言提供习惯词或短语列表(例如“昨天”或“上一季度”)。
虽然Unicode CLDR(通用语言环境数据仓库)提供此类数据,但您必须将其嵌入并与其他库一起才能使用它。遗憾的是,这不仅增加了包的大小,也对加载时间,解析/编译成本和内存消耗产生负面影响。
全新的Intl.RelativeTimeFormat
API把这种负担转移到JavaScript引擎上,让JavaScript引擎来获取语言环境数据并供JavaScript开发人员直接使用。
所以Intl.RelativeTimeFormat
可以在不牺牲性能的情况下实现相对时间的本地格式化。
用法示例
下面展示的是在英语环境下相对时间的格式化。
需要注意的是,传递给Intl.RelativeTimeFormat
构造函数的参数可以是一个标识BCP 47语言标签的字符串,也可以是一个次标注的语言标签数组。
以下是使用简体中文的示例:
此外,Intl.RelativeTimeFormat
构造函数还接受一个可选参数options
,该参数可以对输出进行更细粒度的控制。
为了说明灵活性,让我们根据默认设置英文查看更多输出:
您可能已经注意到,上面的格式化中生成了字符串'1 day ago'
而不是 'yesterday'
,还有'in 0 weeks'
而不是'this week'
。发生这种情况是因为默认情况下,格式化程序使用数值作为默认输出。
要更改此行为,请将numeric
选项设置为'auto'
(而不是隐式默认值 'always'
):
和Intl
类下的其它方法类似,Intl.RelativeTimeFormat
也有format
和formatToParts
方法。虽然format
涵盖了大部分常见的用例,但如果您需要访问输出的各个部分,用formatToParts
则会很有帮助:
有关其它选项及其行为的详细信息,请参阅提案库中的API文档。
最后
Intl.RelativeTimeFormat
默认情况下在V8 v7.1.179和Chrome 71中可用。
随着此API变得更加广泛可用,诸如Moment.js, Globalize和date-fns之类的库,就可以使用更原生的相对时间格式化功能,这样即降低了对硬编码的CLDR数据库的依赖性,又可以提高加载时的性能,分析和编译时的性能,运行时的性能和内存的使用。