我遇到了一个非常奇怪的事情,显然在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
答案 0 :(得分:12)
首先,一些背景知识:IE11实施了ECMA-402 ECMAScript国际化API,重新定义Date.prototype.toLocaleString
(以及toLocaleDateString
和toLocaleTimeString
)作为对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的输出与应用程序中的某些静态值进行比较。此外,根据日期d
,Date.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团队会在此阶段将其视为错误,因为它没有明确的重复步骤