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

问题描述 投票:2回答:2
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控制台中对此进行了测试,无其他地方。

javascript date-formatting
2个回答
5
投票

如果将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为实现和语言环境表示“后子午线”的从属字符串值;否则让fv为实现和依赖于语言环境的字符串值,表示“ ante子午线”。
    • 替换由“ {ampm}”组成的结果子字符串,与fv。

因此,我认为Intl.DateTimeFormat最初与日期对象一起使用,随后在步骤(8)中,它应用此步骤来放置am / pm信息。

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


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

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


0
投票

[这在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"

//Above command should return "04" but it actually returns "4"
© www.soinside.com 2019 - 2024. All rights reserved.