【问题标题】:JavaScript Intl.DateTimeFormat.format vs Date.toLocaleStringJavaScript Intl.DateTimeFormat.format 与 Date.toLocaleString
【发布时间】:2018-08-23 15:06:18
【问题描述】:

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

我应该使用哪一个?

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

似乎它们返回相同的结果。

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"

【问题讨论】:

  • 出于所有实际目的,它们是相同的。 toLocaleString 最初纯粹依赖于实现,但现在它也支持与 Intl 对象相同的选项,两者都基于 ECMA-402 Internationalization API。请注意,ECMA-402 没有指定格式,它只要求符合区域或文化偏好,这可能在实现之间有所不同,即使对于相同的语言和区域也是如此。因此,您可能无法获得完全一致的结果(但非常接近)。
  • @RobG 是的,当然,唤醒错字......而我想记住的关于 perfs 的可能只是 the note in MDN
  • @Kaiido——没问题。 ;-)

标签: javascript date date-format


【解决方案1】:

这非常接近基于意见的偏离主题,但无论如何都是这样。

我应该使用哪一个?

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

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

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

但是,对于大多数实际用途,您是使用 Intl 对象还是 toLocaleString 取决于您自己,我认为没有任何技术理由偏爱其中一个。虽然对于特定实现,两者的结果应该相同,但不要期望生成的字符串在不同的实现中完全相同相同,或者符合给定 BCP 47 language tag 的特定格式。

【讨论】:

  • 谢谢,这是我感兴趣的信息。我很高兴编辑我的问题,以免偏离主题。也许Are there any advantages / disadvantages to using these two approaches?Why do there exist two ways to accomplish the following?What is the history of these two methods? 或其他一些建议
【解决方案2】:

目前所有浏览器中的国际化 API isn't supported - 特别是 IE10 及更低版本以及适用于 Android 11.8 的 UC 浏览器。如果您想支持这些浏览器,请使用 ToLocaleString。 (虽然如果不支持 Internationalization API,则 ToLocalString 返回的内容取决于实现。)

Intl.DateTimeFormat.prototype.format 旨在用于格式化大量日期 - 不是每次都设置区域设置和选项,而是设置一次并从那时起使用生成的格式函数。

【讨论】:

  • 此时Intl.DateTimeFormat.prototype.formatis supported跨主流浏览器
  • @IliasT 尽管我很想放弃对 IE10 的支持,但我仍然有付费客户仍在使用 IE8,尽管我一直在抨击他们。 “所有主要浏览器”与“我的客户使用的浏览器”不同。
  • 哈哈公平。是的,“主要浏览器”不等于“所有浏览器”。
【解决方案3】:

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

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 上测试。

【讨论】:

  • 是的,Date AI 有一种简单直接的方式来指定应该包含哪些组件,即。 toLocaleDateString() vs toLocaleTimeString() vs toLocalString()。对于 Intl API,它似乎是从选项中推断出来的。
猜你喜欢
  • 2014-04-23
  • 1970-01-01
  • 2013-07-02
  • 2011-12-02
  • 2016-01-29
  • 2022-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多