Intl.DateTimeFormat选项哈希:使用'2-digit'获得前导零

时间:2015-10-28 21:00:45

标签: javascript date-formatting

Intl.DateTimeFormat('en-US', {
    weekday: 'long',
    year: 'numeric',
    month: 'long',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit'
}).format(807959700000)

我预计上面的调用会返回类似Wednesday, August 09, 1995, 04:15:00 AM的内容,但似乎缺少小时的前导零。我得到Wednesday, August 09, 1995, 4:15:00 AM

2-digit没有做到这一点,虽然它似乎适用于该月的某一天。 2-digit是否意味着我想要的东西,或者我做错了什么?

P.S。我在Chrome控制台中测试了这个,没有其他地方。

2 个答案:

答案 0 :(得分:4)

Chrome版本79 Node.js v13.7.0 上仍然无法使用!

它们都忽略2-digit格式。这是一个快速的测试案例:

d = new Date('2020-01-01T03:04:09Z') 
new Intl.DateTimeFormat('en', { minute: '2-digit'}).format(d) //"4"

//should return "04" but it actually returns "4"

请在看到此帖子已修复后对其发表评论。

答案 1 :(得分:2)

如果您将hour12属性设置为 false ,则此功能将起作用。即。

Intl.DateTimeFormat('en-US', {
    weekday: 'long',
    year: 'numeric',
    month: 'long',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: false     // setting 24 hour format 
}).format(807959700000);

适用于凌晨2点和下午2点(14小时)。但我知道同样适用于12小时格式,但事实并非如此。我检查了chrome和firefox浏览器。

当我检查规范时,它定义了一个algorithm,可用于实现Intl.DateTimeFormat功能。我看到当hour12属性设置为true时处理了许多特殊情况,最后一步之一是

  
      
  1. 如果dateTimeFormat有一个内部属性[[hour12]],其值为    true ,然后      
        
    • 如果pm为true,那么让fv成为实现和语言环境   依赖字符串值表示“post meridiem”;否则让fv成为一个   实现和区域设置相关的字符串值表示“ante   meridiem”。
    •   
    • 替换由" {ampm}"组成的结果的子字符串,   与fv。
    •   
  2.   

所以我认为,Intl.DateTimeFormat最初使用日期对象,稍后在步骤(8),它应用此步骤来放置am / pm信息。

在此步骤中,可能不会考虑2-digits 中指定的Intl.DateTimeFormat信息,但必须。我认为这是有效的bug,并且已经提出https://code.google.com/p/chromium/issues/detail?id=527926

PS:我不是说问题在规范中,如ECMAScript语言规范中所述,

  

算法是   用于精确指定ECMAScript所需的语义   构造,但并不意味着暗示使用任何特定的   实施技术。