JavaScript Intl.DateTimeFormat.format与Date.toLocaleString

时间:2018-03-14 22:34:06

标签: javascript date date-format

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

我应该使用哪一个?

  1. Intl.DateTimeFormat.prototype.format
  2. Date.prototype.toLocaleString()
  3. 似乎他们会返回相同的结果。

    
    
    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"
    
    
    

3 个答案:

答案 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设计用于格式化大组日期-而不是每次都设置区域设置和选项,而是将它们设置一次并从此以后使用结果格式函数。