Javascript IE11中的ToLocaleDateString()更改

Javascript IE11中的ToLocaleDateString()更改,javascript,date,internet-explorer-11,Javascript,Date,Internet Explorer 11,在IE 11中,我使用ToLocaleDateString()得到了有趣的结果。返回的字符串在浏览器中看起来很好,例如“1/28/2014 11:00:46 AM”,但是如果我将该值复制并粘贴到纯文本编辑器中,它看起来是这样的:“?1?/?28?/?2014?11?:?00?:?46??AM” 有趣的是,如果我将文本粘贴到Microsoft产品中,它看起来很好。。。问题是,如果试图以编程方式使用该值来创建日期,则该值无效。您可以通过在IE11中打开一个控制台并创建一个新日期来测试这一点,在控制台

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

有趣的是,如果我将文本粘贴到Microsoft产品中,它看起来很好。。。问题是,如果试图以编程方式使用该值来创建日期,则该值无效。您可以通过在IE11中打开一个控制台并创建一个新日期来测试这一点,在控制台上使用ToLocaleDateString(),然后尝试使用生成的字符串以javascript或您选择的语言创建一个新日期(我在这里使用ASP.NET…)

是我做错了什么,还是我应该用其他方式与javascript日期交互?我怎样才能摆脱那些时髦的符号

编辑:
多亏了下面的评论,我才能够弄清楚未显示的字符是什么,它们是从左到右的标记。根据我将值粘贴到的编辑器以及编辑器设置为使用的编码,文本将以不同方式显示:有时带“?”,有时不带“。

为完整起见,请回答以下表格:

在我的系统上,IE 11的日期对象的方法
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"| 00000000 22 e2 80 8e 37 e2 80 8e 2f e2 80 8e 36 e2 80 8e |“–Z7–Z/–Z6–Z| 000000 10 2f e2 80 8e 32 30 31 34 22 |/Z2014”| 不可打印的内容是
0xe20x80 0x8e
,其中包含Unicode代码点的UTF-8表示。正如上面的评论所说,这是从左到右的标记

使用从
toLocaleDateString()
返回的值返回日期似乎没有问题。至少在更新版本为11.0.11(KB2976627)的IE 11.0.9600.17239中。那么可能只有控制台添加了额外的字符

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;
}
返回正确的日期。如果不调用fixLocaleDataString(),结果将是无效的日期

问题是,如果试图以编程方式使用该值来创建日期,则该值无效

是我做错了什么,还是我应该用其他方式与javascript日期交互

是的,你做错了。您不应该使用旨在为特定于语言环境的人类显示格式化某些内容的函数,而期望输出是机器可解析的。
toLocaleString
toLocaleDateString
toLocaleTimeString
的任何输出仅用于人类可读的显示。(正如Bergi在评论中澄清的那样,
toString
也用于人类显示,但表示它应该是往返的)

您可能会得到LTR标记,因为您的显示区域设置是RTL。除此之外,考虑区域设置将永远影响输出。也许您的区域设置使用dd/mm/yyyy格式而不是mm/dd/yyyy格式。或者您的区域设置需要亚洲或阿拉伯字符。在确定显示格式时,这些都是需要考虑的因素,但对于机器解析来说,这些都是不合适的

还考虑ECMAScript规范不为这些方法的输出定义任何特定的格式化规则,不同的浏览器将产生不同的结果。 如果目的不是向用户显示,则应使用以下功能之一:

  • toISOString
    将为您提供ISO8601/RFC3339格式的时间戳
  • togmString
    toutString
    将为您提供RFC822/RFC1123格式的时间戳
  • getTime
    将为您提供毫秒精度的整数Unix时间戳
以上所有操作都将返回一个基于UTC的值。如果需要本地时间,可以使用各种访问器函数(
getFullYear
getMonth
等)构建自己的字符串,也可以使用以下库:

这将使用moment.js返回ISO8601格式的本地时间+日期偏移量:

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

我用下面的
替换(/[^-~]/g',)
修复了这个问题,如中所示

(new Date("7/15/2014").toLocaleString().replace(/[^ -~]/g,'')
var startDateConverted=new Date(start).toLocaleString().replace(/[^A-Za-z 0-9\,\?”“!@\\$%^&*\(\)-\=\+;:\/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

如果您还想删除时间,请使用
.split(“”).slice(0,-1).join(“”);

您使用的是什么“纯文本编辑器”,它使用的是什么编码?请执行
var str=(新日期).toLocaleDateString();for(var i=0;iI使用的是“TextPad”作为我的编辑器。它在ANSI、DOS、UTF-8和Unicode中以这种方式显示。当我将其粘贴到记事本中时,它不会显示。运行javascript会产生:var str=(新日期)。toLocaleDateString();for(var I=0;iIt是IE11中的一个错误,您可以使用toLocaleDateString()。替换(/\u200E/g,)为了解决这个问题。谢谢,这让我发疯。这解释了角色是什么,但这并不是个谜。我认为更大的问题是,如果你从ToLocaleDateString()的输出开始,如何回到实际日期我更新了答案,使之包含一个似乎没有遇到问题的JSFIDLE链接。这看起来是可行的,所以我将它标记为答案。但这感觉像是一个黑客。尝试从ToLocaleDateString()的输出中获取日期对象是错误的吗?如果日期选择器用ToLocaleDateString()填充输入,会怎么样?您应该如何在服务器端获取日期?如果您只是从输入中获取值,它将具有从左到右的字符,这将使您陷入混乱。根据您使用的服务器端技术,左/右字符将得到正确处理(即忽略).我将其与MVC5 web服务一起使用,将输入作为字符串传输,然后通过DateTime.parse使用parse-它可以
(new Date("7/15/2014").toLocaleString().replace(/[^ -~]/g,'')
var startDateConverted = new Date(start).toLocaleString().replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '')