我想使用特定的时区,区域设置和显示选项打印表示日期的字符串。
我应该使用哪一个?
似乎他们会返回相同的结果。
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"

答案 0 :(得分:5)
这非常接近基于意见的偏离主题,但无论如何都要进行。
我应该使用哪一个?
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的特定格式
答案 1 :(得分:1)
除了其他人发表的观点外,我发现与 默认格式(选项) 不同:
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测试。
答案 2 :(得分:0)
尚未在所有浏览器中使用国际化API isn't supported-值得注意的是IE10和更低版本以及适用于Android 11.8的UC浏览器。如果要支持这些浏览器,请使用ToLocaleString。 (尽管如果不支持国际化API,则ToLocalString返回的内容取决于实现。)
Intl.DateTimeFormat.prototype.format设计用于格式化大组日期-而不是每次都设置区域设置和选项,而是将它们设置一次并从此以后使用结果格式函数。