2015-08-19 63 views
6

我无法理解某些似乎在Edge中表现不同的JavaScript所发生的情况。 具体煮它归结为:Microsoft Edge javascript toLocaleTimeString不正确的间距

var testi = new Date().toLocaleTimeString(); 
var len2 = testi.length; 
alert(len2); 

我在边长为17,在Chrome和IE是10 似乎是在字符串中的一些假想空间,也搞砸了我的企图串吧。

https://jsfiddle.net/m1m8h7ym/

FYI我的时区是美国中央。

+0

你为什么想上的toLocaleString的结果时,你可以提取日期对象的任何部分字符串操作? – marekful

+0

我的目标是面对09:30 AM格式的时间字符串,我不想24小时进行AM/PM和时区转换,所以我将toLocaleTimeString()的秒数导致我发现这个JavaScript错误(quirk?)这是一些较老的代码,只有少数用户升级到我们刚开始看到的Windows 10。在IE,Chrome和Firefox中工作良好 – Aaron

回答

6

看起来像微软在the invisible left-to-right mark滑倒。这也发生在边缘模式下的IE11中。我想通了这一点通过每个字符串中的字符循环并将它传递给encodeURIComponent()

var output = document.getElementById("output"); 
 
var testi = new Date().toLocaleTimeString(); 
 
var row; 
 
for (var i = 0, len = testi.length; i < len; i++) { 
 
    row = document.createElement("pre"); 
 
    row.innerHTML = encodeURIComponent(testi[i]); 
 
    output.appendChild(row); 
 
}
<div id="output"></div>

你可以通过它的Unicode,可以在正则表达式被捕捉移除它剥离出来表达式\u200E

var output = document.getElementById("output"); 
 
var testi = new Date().toLocaleTimeString().replace(/\u200E/g,""); 
 
var row; 
 
for (var i = 0, len = testi.length; i < len; i++) { 
 
    row = document.createElement("pre"); 
 
    row.innerHTML = encodeURIComponent(testi[i]); 
 
    output.appendChild(row); 
 
}
<div id="output"></div>

+0

太棒了!通过在'.toLocaleTimeString()'的调用中添加'.replace(/ \ u200E/g,“”)'修复了Edge的代码现在适用于所有浏览器,谢谢! – Aaron

+1

很高兴能帮到你!请注意,'.toLocaleTimeString()'返回的字符串在不同的区域设置/文化之间可能会有很大差异。如果在使用希伯来语/阿拉伯语作为浏览器默认设置时显示“从右到左”的控制标记,我不会感到惊讶。 – Thriggle

+0

好警告,幸运的是,这是一个多时区美国公司的内部网页,我不会推荐这个外部使用。 – Aaron