Javascript Intl.DateTimeFormat hours12 在 Chrome 上给出奇怪的输出

JSa*_*oro 9 javascript datetime

我在 Chrome 上看到了这样的行为,其中将 hours12 设置为 true 格式的中午 12:00 时间的返回值显示为下午 0 点。不应该是12吗?如果不是,显示 12 小时时钟的正确方法是什么?请注意,我只能使用 ES5。

Chrome 中的以下内容打印 0 pm:

var foo = new Date(2020, 0, 1, 12, 0, 0)
var bar = new Intl.DateTimeFormat("en-GB", {hour12: true, hour: "numeric"}).format(foo)
console.log(bar)
Run Code Online (Sandbox Code Playgroud)

请注意,bar 的值为“0 pm”。除 en-GB 之外的其他语言也表现出这种行为。不过,使用 en-US 运行相同的代码却给出“12 PM”。难道英国人和其他人实际上用“0 pm”来表示中午?这是 Chrome 中的错误吗?在 FF 或 IE 中不会发生这种情况。

预先感谢您的任何意见。

小智 12

不确定您是否仍在寻找解决方案...我也遇到了同样的问题,但发现使用hourCycle: 'h12'有效而不是hour12: true


Rob*_*obG 3

这可能是小时周期的问题。它应该基于提供的语言代码,并且应该通过将“hc”选项设置为“h11”、“h12”、“h23”、“h24”之一来覆盖。

然而,Chrome 似乎无论如何都会忽略小时周期:

var foo = new Date(2020, 0, 1, 12, 0, 0)
var bar = new Intl.DateTimeFormat("en-GB", {
  hour12: true,
  hour: "numeric",
  hc: "h12" // Should force 12 am / 12 pm
}).format(foo);

console.log(bar); // 0 pm in Chrome, 12 pm in others
Run Code Online (Sandbox Code Playgroud)

根据 MDN,如果同时设置了hour12hc选项,则hour12优先。但是,删除hour12选项并且设置hc:"12"仅返回“12”,没有“pm”,并且午夜为“00”。

Intl 对象不指定语言映射到什么格式,而是由各个实现来确定特定语言或文化使用的格式。因此,您可以通过反复试验来找到可以完成这项工作的语言代码,例如,在本例中,仅使用“en”而不是“en-GB”在 Chrome 中返回 12 pm。

据我所知, Intl 对象不适合格式化日期。它实际上只适用于使用formatToParts方法方便地获取日期部分,然后从那里手动格式化。它也可以方便地根据 IANA 位置获取时区中的日期和时间,但您不能指望它仅根据语言代码在不同实现中正确或一致地格式化日期。