我想使用特定的时区,区域设置和显示选项打印表示日期的字符串。
我应该使用哪一个?
似乎他们返回相同的结果。
const event = new Date(1521065710000);
const options = {
day: 'numeric',
month: 'long',
weekday: 'short',
hour: 'numeric',
minute: 'numeric',
timeZoneName: 'short',
timeZone: 'America/Los_Angeles',
};
console.log(event.toLocaleString('en-US', options));
// "Wed, March 14, 3:15 PM PDT"
console.log(new Intl.DateTimeFormat('en-US', options).format(event));
// "Wed, March 14, 3:15 PM PDT"
这非常接近基于意见的偏离主题,但无论如何都要进行。
我应该使用哪一个?
Date.prototype.toLocaleString最初只是依赖于实现,并且在浏览器之间有很大差异。当添加对Intl对象的支持时(ECMAScript 2015,ed 6),允许toLocaleString支持相同的选项。虽然ECMA-262没有强制要求支持,但可能所有当前的实现都支持它。
请注意,这并没有删除允许的实现可变性,它只提供了一些基于语言,区域和方言的格式化选项(以及基于IANA time zone database标识符和值的时区选项)。
Intl对象(以及toLocaleString)基于ECMA-402,它没有严格指定格式,因此实现仍有一些空间可供区别。最大的区别在于时区名称(没有标准)和逗号,空格等的位置。
但是,对于大多数实际用途,无论您使用Intl对象还是toLocaleString都取决于您,我认为没有任何技术理由可以优先选择其中一个。虽然两者的结果对于特定实现应该是相同的,但是不要期望结果字符串在实现之间完全相同或者符合给定BCP 47 language tag的特定格式。
除了其他人发布的积分外,我看到了默认格式(选项)的不同之处:
const event = new Date(1521065710000);
//const options = ...
console.log(event.toLocaleString('en-US' /*, options*/));
// "3/15/2018, 1:45:10 AM"
console.log(new Intl.DateTimeFormat('en-US' /*, options*/).format(event));
// "3/15/2018"
针对Chrome v72进行了测试。
所有浏览器中的国际化API isn't supported还是 - 尤其是IE10及以下版本以及适用于Android 11.8的UC浏览器。如果要支持这些浏览器,请使用ToLocaleString。 (虽然如果不支持Internationalization API,ToLocalString返回的内容依赖于实现。)
Intl.DateTimeFormat.prototype.format用于格式化大型日期组 - 而不是每次都设置区域设置和选项,您只需设置一次并使用生成的格式函数。