IE 10+无法解析使用自己的date.prototype.toLocaleString生成的日期字符串

IE 10+ unable to parse the date strings produced with its own Date.prototype.toLocaleString

本文关键字:toLocaleString prototype 字符串 日期 date 自己的 IE      更新时间:2023-09-26

我正在使用Selenium测试AngularJS应用程序。在测试过程中的某个时刻,我想确保日期在可接受的范围内。当测试运行时,会发生类似的情况:

Date.parse(new Date().toLocaleString())

我之所以说"等价",是因为我自己并没有显式地调用toLocaleString(),而是间接地解析toLocaleString()的结果。当我在Firefox和Chrome上测试时,没有任何问题。这两个浏览器能够解析它们自己的日期字符串。

然而,在IE上,我总是得到NaN。我发现,如果我查看MSDN文档并使用与toLocaleString()生成的格式相同的字符串文字,就不会出现错误。例如,这是有效的:

Date.parse("6/9/2010 3:20 pm")

我不明白为什么当我输入一个文字时,它是有效的,但当我试图对toLocaleString()的结果使用parse()时,它失败了。

我在IE 10和IE 11中得到了那个错误,但在IE 9中没有。

我很清楚使用toLocaleString()的问题,它如何根据用户偏好而变化,等等。在我的测试中,使用toLocaleString()是非常正确的。

解决方案

删除IE在toLocaleString():输出中从左到右的标记

Date.parse(new Date().toLocaleString().replace(/'u200E/g, ''));

解释

问题是IE对toLocaleString()的实现输出了从左到右的标记。让我们以问题中的文字字符串为例,看看我们从toLocaleString():中得到了什么

new Date(Date.parse("6/9/2010 3:20 pm")).toLocaleString()
> 6/9/2010 03:20:00 PM

让我们看看字符串的开头是什么:

new Date(Date.parse("6/9/2010 3:20 pm")).toLocaleString().charCodeAt(0)
> 8206

这是一个与十六进制200E相对应的十进制数。这是从左到右的标记,混淆了parse()函数。实际上,在字符串中的每个数字前后都有一整串。如果我们删除它们,那么IE就能够解析字符串。