ToLocaleDateString()在IE11中更改

在IE 11中,我用ToLocaleDateString()得到了有趣的结果。 返回的string在浏览器中看起来很好,例如“2014/1/28 11:00:46 AM”,但是如果我将该值复制并粘贴到纯文本编辑器中,则如下所示:“?1?/? 28?/?2014?11?:?00?:?46??AM“。

有趣的是,如果我将文本粘贴到Microsoft产品中,它看起来很好…问题是,如果您尝试以编程方式使用该值来创builddate,则这是无效的。 你可以通过在IE11中打开一个控制台并创build一个新的date,使用ToLocaleDateString()对它进行testing,然后尝试使用生成的string来创build一个新的date在JavaScript或你select的语言(我'在这里使用ASP.NET …)。

我做错了什么,或者是否有其他方式我应该与JavaScriptdate交互? 我怎样才能摆脱那些时髦的符号?

编辑:感谢下面的评论,我能够找出未显示的字符是什么,他们是从左到右的标记。 根据编辑器将值粘贴到编辑器设置使用的编码中,文本将以不同的方式显示:有时使用“?”,有时不使用。

问题是,如果您尝试以编程方式使用该值来创builddate,则无效。

我做错了什么,或者是否有其他方式我应该与JavaScriptdate交互?

是的,你做错了。 您不应该使用旨在为特定于语言环境的人类显示设置格式的函数,并期望输出是机器可parsing的。 toLocaleStringtoLocaleDateStringtoLocaleTimeString任何输出只能用于人类可读的显示。 (正如Bergi在评论中澄清的, toString也是为人类展示的,但ECMA§15.9.4.2说它应该往返)

您可能会获得LTR标记,因为您的显示区域设置为RTL。 除此之外,考虑到区域总是会影响输出。 也许您的语言环境使用dd / mm / yyyy格式而不是mm / dd / yyyy格式。 或者您的语言环境可能需要亚洲或阿拉伯字符。 这些都是确定显示格式时的注意事项,但绝不适合机器parsing。

还要考虑ECMAScript规范没有为这些方法的输出定义任何特定的格式规则,不同的浏览器将产生不同的结果。

如果意图不是向用户显示,则应使用以下function之一:

  • toISOString会给你一个ISO8601 / RFC3339格式的时间戳
  • toGMTStringtoUTCString会给你一个RFC822 / RFC1123格式的时间戳
  • getTime将为您提供毫秒级精度的整数Unix时间戳

以上所有将返回一个基于UTC的值。 如果你想要本地时间,你可以用各种访问函数( getFullYeargetMonth等等)构build你自己的string,也可以使用像moment.js这样的库:

这使用了moment.js来返回一个ISO8601格式的本地时间+从一个date偏移量:

 moment(theDate).format() // ex: "2014-08-14T13:32:21-07:00" 

我用下面的replace(/[^ -~]/g,'')来修正这个问题

 (new Date("7/15/2014").toLocaleString().replace(/[^ -~]/g,'') 
 function FixLocaleDateString(localeDate) { var newStr = ""; for (var i = 0; i < localeDate.length; i++) { var code = localeDate.charCodeAt(i); if (code >= 47 && code <= 57) { newStr += localeDate.charAt(i); } } return newStr; } 

只返回数字和/字符。 似乎做这个工作:

 new Date(FixLocaleDateString(new Date("7/15/2014").toLocaleString())); 

返回正确的date。 没有调用FixLocaleDateString(),结果将是一个无效的date。

为了完整,回答表单:

在我的系统中,IE 11的Date对象的方法toLocaleDateString在控制台中运行时会导致"7/6/2014" ,它表示为以下字节:

 00000000 22 e2 80 8e 37 e2 80 8e 2f e2 80 8e 36 e2 80 8e |“âZ7âZ/âZ6â.Z|
 00000010 2f e2 80 8e 32 30 31 34 22 |/â.Z2014“|

非打印表是0xe2 0x80 0x8e ,其中UTF-8是Unicode Code Point U + 200E的表示 。 就像上面所说的那样,就是左对右的标记。

这个JSFiddle似乎没有麻烦使用toLocaleDateString()返回的值返回一个date。 至less在我的IE 11.0.9600.17239与更新版本11.0.11(KB2976627)。 所以也许只有控制台添加额外的字符?