IE 的 toLocaleString 结果中有奇怪的字符

IT技术 javascript internet-explorer
2021-03-07 04:59:52

我遇到了一个超级奇怪的事情,它显然是特定于 IE 的toLocaleString日期。

在 IE 控制台窗口中:

new Date("2014-08-28T20:51:09.9190106Z").toLocaleString();
"‎8‎/‎28‎/‎2014‎ ‎1‎:‎51‎:‎09‎ ‎PM"

现在,手动将该字符串作为字符串键入,并将其与方法返回的内容进行比较:

"8/28/2014 1:51:09 PM" === new Date("2014-08-28T20:51:09.9190106Z").toLocaleString();
false

有谁知道为什么会在 IE 中发生这种情况?这不会发生在 Chrome 中。

更新:更多示例:

new Date("8/28/2014 1:51:09 PM")
[date] Thu Aug 28 2014 13:51:09 GMT-0700 (Pacific Daylight Time)[date] Thu Aug 28 2014 13:51:09 GMT-0700 (Pacific Daylight Time)

new Date(new Date("2014-08-28T20:51:09.9190106Z").toLocaleString())
[date] Invalid Date[date] Invalid Date
5个回答

首先,一些背景知识:IE11 实现了 ECMA-402 ECMAScript 国际化 API,该 API 重新定义Date.prototype.toLocaleString(以及toLocaleDateStringtoLocaleTimeString)作为对formaton 的调用Intl.DateTimeFormat因此,d.toLocaleString()等价于

Intl.DateTimeFormat(undefined, {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric',
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric'
}).format(d)

您可能认为这是非常明确的,但浏览器在它们支持的格式和组成格式的字符方面有很大的余地。这是设计使然 - 对于地球上的所有语言环境和语言,指定这将是非常繁重的并且很难保持最新状态。出于这个原因,您不能期望能够比较toLocaleString跨浏览器的结果,甚至不能期望同一浏览器在不同版本之间继续提供相同的结果。随着底层语言环境数据发生变化(可能是因为本地自定义发生了变化,或者有更多数据可用,或者添加了更好的格式),从该 API 返回的格式也将发生变化。

从中得出的结论是,您不应该尝试将toLocaleStringAPI的输出与应用程序中的某些静态值进行比较此外,给定一个 date dDate.parse(d.toLocaleString())有时可能会起作用,但有时可能会起作用,但有时可能会起作用,但取决于区域设置,因此最好也避免这种情况。

话虽如此,en-US 相对稳定,而且大多数浏览器(目前)都同意这种基本格式是什么。但是,IE 会在日期周围插入双向控制字符。这是设计使然,因此当与其他文本连接时,输出文本将正确流动。这在混合 LTR 和 RTL 内容时尤其重要,例如将格式化的 RTL 日期与 LTR 文本连接。

这就是我们最终要做的,首先将我们的测试更改为不依赖于 的特定输出toLocaleString,然后仅toLocaleString在我们的淘汰模板绑定中使用而不是在代码本身中使用,并将日期对象保留为实际日期其余的代码。
2021-05-20 04:59:52

利用

Str.replace(/[^ -~]/g,'')

这将删除不需要的特殊字符。

对 IE 错误的出色破解 :)
2021-04-26 04:59:52
这还不错,但 März 现在是 Mrz,这在德国是有效的月份名称
2021-05-21 04:59:52

事实证明你看不到它们,但 IE 的 Date.toLocaleString 显然包含从左到右的标记(U+200E):

8<200E>/<200E>21<200E>/2014<200E> <200E> 9<200E>:<200E>16<200E>:<200E>:18<200E> <200E>AM

惊人的。我想是时候向 IE 提交错误了?

来自 IE 团队的 brian 添加了一个更具体的答案,所以我的答案不再是最佳答案:)
2021-05-03 04:59:52
IE 团队通过电子邮件参与。如果我得到更多信息,我会更新这个。
2021-05-13 04:59:52

请看http://jsbin.com/mehowehase/1/edit?html,js,console

var dt = new Date();
var x = dt.toLocaleDateString();
console.log("length : "+x.length);
var arr = x.split("/");
console.log("month : "+parseInt(arr[0],10));

上面的 x 的长度在 IE 中是 14,而在其他浏览器中是 9。这支持 John 的评论,即 IE 正在添加从左到右的标记。这对我来说绝对是一个错误。

我们认为这是一个错误,IE/Edge 团队是上面实际响应的人,并且“您可能认为这是非常明确的,但是浏览器在它们支持的格式和组成格式的字符方面有很大的余地. 这是设计使然 - 对于地球上的所有语言环境和语言,指定这将是非常繁重的,并且很难保持最新状态。”
2021-05-20 04:59:52

我在我的 IE11 中没有看到这个,所以它可能与你在 IE 或你的机器中的设置/配置有关。对我来说,结果是:

"‎28‎/‎08‎/‎2014‎ ‎21‎:‎51‎:‎09" === new Date("2014-08-28T20:51:09.9190106Z").toLocaleString(); true

您是否复制粘贴了从网页传递给构造函数的日期字符串?

我认为 IE 团队现阶段不会将其视为错误,因为它没有明确的重现步骤

鉴于我在哪里工作,他们可能会接受:) 我们可以使用 IE 等在 QUnit 的单元测试中重现这一点,我们组织中的每个人都可以。
2021-05-16 04:59:52