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的。 toLocaleString
, toLocaleDateString
或toLocaleTimeString
任何输出只能用于人类可读的显示。 (正如Bergi在评论中澄清的, toString
也是为人类展示的,但ECMA§15.9.4.2说它应该往返)
您可能会获得LTR标记,因为您的显示区域设置为RTL。 除此之外,考虑到区域总是会影响输出。 也许您的语言环境使用dd / mm / yyyy格式而不是mm / dd / yyyy格式。 或者您的语言环境可能需要亚洲或阿拉伯字符。 这些都是确定显示格式时的注意事项,但绝不适合机器parsing。
还要考虑ECMAScript规范没有为这些方法的输出定义任何特定的格式规则,不同的浏览器将产生不同的结果。
如果意图不是向用户显示,则应使用以下function之一:
-
toISOString
会给你一个ISO8601 / RFC3339格式的时间戳 -
toGMTString
或toUTCString
会给你一个RFC822 / RFC1123格式的时间戳 -
getTime
将为您提供毫秒级精度的整数Unix时间戳
以上所有将返回一个基于UTC的值。 如果你想要本地时间,你可以用各种访问函数( getFullYear
, getMonth
等等)构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)。 所以也许只有控制台添加额外的字符?