IE11中的ToLocaleDateString()更改

时间:2014-01-28 18:25:05

标签: javascript date internet-explorer-11

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

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

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

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

5 个答案:

答案 0 :(得分:36)

我使用

中的replace(/[^ -~]/g,'')修复了该问题
(new Date("7/15/2014").toLocaleString().replace(/[^ -~]/g,'')

答案 1 :(得分:23)

  

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

     

...

     

我做错了什么,或者是否有其他方式我应该与javascript日期进行交互?

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

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

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

如果意图不是向用户显示,那么您应该使用以下功能之一:

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

以上所有内容都将返回基于UTC的值。如果您想要本地时间,您可以使用各种访问器函数(getFullYeargetMonth等)构建自己的字符串,或者您可以使用{{3}等库}:

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

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

答案 2 :(得分:3)

为完整起见,请回答:

在我的系统上,IE 11的Date对象的方法toLocaleDateString在Console中运行时会产生"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"|

非printables是0xe2 0x80 0x8e,其中是Unicode代码点U+200E的UTF-8表示。正如上面的评论所说,这就是左移标记。

This JSFiddle似乎无法使用toLocaleDateString()返回的值来回到某个日期。至少在我的IE 11.0.9600.17239中使用更新版本11.0.11(KB2976627)。所以也许只有控制台添加额外的字符?

答案 3 :(得分:3)

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()));

返回正确的日期。如果没有调用FixLocaleDateString(),结果将是无效的日期。

答案 4 :(得分:0)

var startDateConverted = new Date(start).toLocaleString().replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '')

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