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

Lou*_*uis 4 javascript internet-explorer date

我正在使用Selenium测试AngularJS应用程序.在测试期间的某个时刻,我想确保日期在可接受的范围内.测试运行时,会发生与此类似的事情:

Date.parse(new Date().toLocaleString())
Run Code Online (Sandbox Code Playgroud)

我说"等效"因为我没有明确地称toLocaleString()自己,但我正在toLocaleString()间接解析结果.当我在Firefox和Chrome上测试时,没有任何问题.这两个浏览器能够解析自己的日期字符串.

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

Date.parse("6/9/2010 3:20 pm")
Run Code Online (Sandbox Code Playgroud)

我不明白为什么当我输入一个文字,它的工作原理,但当我尝试使用parse()它的结果toLocaleString()失败.

我在IE 10和IE 11中得到了这个错误,但在IE 9中却没有.

我很清楚有关使用的问题toLocaleString(),它如何根据用户的喜好等变化.在我的测试环境中,使用toLocaleString()是非常正确的.

Lou*_*uis 6

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

Date.parse(new Date().toLocaleString().replace(/\u200E/g, ''));
Run Code Online (Sandbox Code Playgroud)

说明

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

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

让我们看一下字符串开头的内容:

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

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