JavaScript Intl.DateTimeFormat.format与Date.toLocaleString

问题描述 投票:5回答:3

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

我应该使用哪一个?

  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"
javascript date date-format
3个回答
7
投票

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

我应该使用哪一个?

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的特定格式。


2
投票

除了其他人发布的积分外,我看到了默认格式(选项)的不同之处:

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进行了测试。


1
投票

所有浏览器中的国际化API isn't supported还是 - 尤其是IE10及以下版本以及适用于Android 11.8的UC浏览器。如果要支持这些浏览器,请使用ToLocaleString。 (虽然如果不支持Internationalization API,ToLocalString返回的内容依赖于实现。)

Intl.DateTimeFormat.prototype.format用于格式化大型日期组 - 而不是每次都设置区域设置和选项,您只需设置一次并使用生成的格式函数。

© www.soinside.com 2019 - 2024. All rights reserved.