在IE 11中,我使用ToLocaleDateString()获得了有趣的结果.返回的字符串在浏览器中看起来很好,例如"1/28/2014 11:00:46 AM",但是如果我将该值复制并粘贴到纯文本编辑器中,它看起来像这样:"?1?/? 28?/?2014?11?:?00?:?46 ?? AM".
有趣的是,如果我将文本粘贴到Microsoft产品中,它看起来很好......问题是,如果您尝试以编程方式使用该值来创建日期,则它无效.您可以通过在IE11中打开一个控制台并创建一个新日期,使用ToLocaleDateString()对它进行测试,然后尝试使用生成的字符串以javascript或您选择的语言创建一个新日期(我'我在这里使用ASP.NET ...).
我做错了什么,或者是否有其他方式我应该与javascript日期进行交互?我怎样才能摆脱那些时髦的符号?
编辑: 感谢下面的评论,我能够弄清楚未显示的字符是什么,它们是从左到右的标记.根据编辑器我将值粘贴到编辑器设置使用的编码和编码,文本将以不同的方式显示:有时带"?",有时没有.
我修正了以下内容replace(/[^ -~]/g,'')
,如下所示
(new Date("7/15/2014").toLocaleString().replace(/[^ -~]/g,'')
问题是,如果您尝试以编程方式使用该值来创建日期,则该日期无效.
...
我做错了什么,或者是否有其他方式我应该与javascript日期进行交互?
是的,你做错了.您不应该使用旨在为特定于语言环境的人类显示格式化某些内容的函数,并期望输出可机器分析.任何的输出的toLocaleString
,toLocaleDateString
或toLocaleTimeString
仅仅是用来人类可读显示.(正如Bergi在评论中澄清的那样,toString
也用于人类展示,但ECMA§15.9.4.2表示它应该往返)
您可能会获得LTR标记,因为您的显示区域设置是RTL.除此之外,请考虑区域设置始终会影响输出.也许您的语言环境使用dd/mm/yyyy格式而不是mm/dd/yyyy格式.或者您的语言环境可能需要亚洲或阿拉伯语字符.这些都是确定显示格式时的注意事项,但永远不适合机器解析.
还要考虑ECMAScript规范没有为这些方法的输出定义任何特定的格式规则,并且不同的浏览器将产生不同的结果.
如果意图不是向用户显示,那么您应该使用以下功能之一:
toISOString
将为您提供ISO8601/RFC3339格式的时间戳
toGMTString
或者toUTCString
将为您提供RFC822/RFC1123格式的时间戳
getTime
将为您提供一个整数Unix时间戳,精度为毫秒
以上所有都将返回基于UTC的值.如果你想在本地时,您可以使用各种存取功能(打造你自己的字符串getFullYear
,getMonth
等等),或者你可以使用一个库如moment.js:
这使用moment.js从日期返回ISO8601格式的本地时间+偏移量:
moment(theDate).format() // ex: "2014-08-14T13:32:21-07:00"