Intl.DateTimeFormat 选项哈希:使用“2 位数字”获取前导零

2024-02-27

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意思是超出我的预期,或者我做错了什么?

附:我在 Chrome 控制台中测试了这一点,没有在其他地方进行测试。


如果您设置,这将起作用hour12财产给false. i.e.

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浏览器。

当我检查规格时,它定义了一个算法 http://www.ecma-international.org/ecma-402/1.0/#FormatDateTime可以用来实现Intl.DateTimeFormat功能。我看到当 hour12 属性设置为 true 时,处理了许多特殊情况,最后一步之一是

  1. If dateTimeFormat has an internal property [[hour12]] whose value is true, then
    • 如果 pm 为真,则令 fv 为实现和区域设置 表示“post meridiem”的相关字符串值;否则令 fv 为 与实现和语言环境相关的表示“ante”的字符串值 子午线”。
    • 替换结果中由“{ampm}”组成的子字符串, 与 fv。

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

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


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Intl.DateTimeFormat 选项哈希:使用“2 位数字”获取前导零 的相关文章

随机推荐