JavaScript Intl.DateTimeFormat.format 对比 Date.toLocaleString

JavaScript Intl.DateTimeFormat.format vs Date.toLocaleString

我想使用特定时区、区域设置和显示选项打印表示日期的字符串。

我应该使用其中的哪一个?

  1. Intl.DateTimeFormat.prototype.format
  2. Date.prototype.toLocaleString()

它们似乎 return 相同的结果。

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"

这非常接近于基于观点的离题,但无论如何都可以。

Which one of these should I use?

Date.prototype.toLocaleString 最初完全依赖于实现,并且在浏览器之间变化很大。当添加了对 Intl 对象的支持时(ECMAScript 2015,第 6 版),则允许 toLocaleString 支持相同的选项。虽然 ECMA-262 不强制支持,但可能所有当前的实现都支持它。

请注意,这并没有消除允许的实施可变性,它只是提供了一些基于语言、地区和方言的格式选项(以及基于 IANA time zone database 标识符和值的时区选项)。

Intl 对象(因此 toLocaleString)基于 ECMA-402,它没有严格指定格式,因此在实现上仍有一些差异空间.最大的区别在于时区名称(没有标准)和逗号、空格等的放置。

但是,对于大多数实际用途,您是使用 Intl 对象还是使用 toLocaleString 取决于您,我认为没有任何技术原因可以让您更喜欢其中一个。 .虽然两者的结果对于特定的实现应该是相同的,但不要期望结果字符串在不同的实现中 完全相同 或符合给定的特定格式 BCP 47 language tag.

所有浏览器中的国际化 API isn't supported - 特别是 IE10 及以下版本和 Android 11.8 的 UC 浏览器。如果要支持这些浏览器,请使用 ToLocaleString。 (虽然如果国际化 API 不受支持,什么 ToLocalString returns 是依赖于实现的。)

Intl.DateTimeFormat.prototype.format 专为格式化大量日期而设计 - 无需每次都设置语言环境和选项,只需设置一次并从那时起使用生成的格式函数。

除了其他人发布的积分外,我看到了与默认格式(选项)的区别:

const event = new Date(1521065710000)

//const o = options

console.log(event.toLocaleString('en-US' /*, o*/))  // "3/15/2018, 1:45:10 AM"

console.log(new Intl.DateTimeFormat('en-US' /*, o*/).format(event))  // "3/15/2018"

在 Chrome v72 - v85 / Node v14 上测试。