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

时间:2014-08-29 19:26:40

标签: javascript internet-explorer

我遇到了一个非常奇怪的事情,显然在toLocaleString日期是特定于IE的。

在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 个答案:

答案 0 :(得分:12)

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

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

您可能认为这是非常明确的,但浏览器允许大量的余地,它们支持的格式以及构成格式的字符。这是设计 - 使用地球上的所有语言环境和语言,指定这将是非常繁重的,并且很难保持最新。出于这个原因,您无法期望能够跨浏览器比较toLocaleString的结果,甚至希望相同的浏览器能够从发布到发布继续提供相同的结果。随着基础语言环境数据的更改(可能是因为本地自定义已更改,或者有更多数据可用,或者添加了更好的格式),从此API返回的格式也是如此。

这样做的一点是,您应该尽量不依赖于将toLocaleString API的输出与应用程序中的某些静态值进行比较。此外,根据日期dDate.parse(d.toLocaleString())有时可能有效,但有些可能不会有效,具体取决于区域设置,所以最好也避免这样做。

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

答案 1 :(得分:10)

使用

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

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

答案 2 :(得分:7)

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

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

真棒。我想是时候向IE提交一个错误了吗?

答案 3 :(得分:1)

请查看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));

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

答案 4 :(得分:0)

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

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

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

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