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控制台中对此进行了测试,无其他地方。
如果将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时处理了许多特殊情况,最后一步之一是
- 如果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所需的语义构造,但无意暗示使用任何特定的实现技术。
[这在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"