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控制台中测试了这个,没有其他地方。
答案 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时处理了许多特殊情况,最后一步之一是
- 如果dateTimeFormat有一个内部属性[[hour12]],其值为 true ,然后
醇>
- 如果pm为true,那么让fv成为实现和语言环境 依赖字符串值表示“post meridiem”;否则让fv成为一个 实现和区域设置相关的字符串值表示“ante meridiem”。
- 替换由" {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所需的语义 构造,但并不意味着暗示使用任何特定的 实施技术。