在Javascript中拆分字符串的奇怪行为

在Javascript中拆分字符串的奇怪行为,javascript,internet-explorer-11,parseint,Javascript,Internet Explorer 11,Parseint,我试着做一些相对简单的事情。我的日期格式为dd/MM/yyyy,例如: var newDate = "‎11‎/‎06‎/‎2015"; 我想把它转换成日期 此代码仅适用于Chrome和Firefox: new Date(newDate) 在IE11中,我得到了Nan 所以我试着这样做: var parts = newDate.split("/"); var year = parts[2].trim(); var month = parts[1].trim(); var day = part

我试着做一些相对简单的事情。我的日期格式为dd/MM/yyyy,例如:

var newDate = "‎11‎/‎06‎/‎2015";
我想把它转换成日期

此代码仅适用于Chrome和Firefox:

new Date(newDate)
在IE11中,我得到了
Nan

所以我试着这样做:

var parts = newDate.split("/");
var year = parts[2].trim();
var month = parts[1].trim();
var day = parts[0].trim();
var dt = new Date(Number(year), Number(month) - 1, Number(day));
这应该是可行的,但我遇到了一个非常奇怪的错误

如果您尝试此代码:

函数myFunction(){
var newDate=”‎11‎/‎06‎/‎2015";
var parts=newDate.split('/');
变量年份=零件[2]。修剪();
var a=年;
var b=数量(年);
var c=parseInt(年份,10);
var d=零件;
var n=a+“
”+b+“
”+c+“
”+d; document.getElementById(“demo”).innerHTML=n; }
单击按钮查看解析错误

试试看

对于较旧的浏览器,您需要编写一个函数来解析字符串

下面的函数将创建一个
日期。fromISO
方法-如果浏览器可以从ISO字符串中以本机方式获取正确的日期,则使用本机方法。某些浏览器获取的日期部分正确,但返回了错误的时区,因此仅检查NaN可能不行

(function(){
var D= new Date('2011-06-02T09:34:29+02:00');
if(!D || +D!== 1307000069000){
    Date.fromISO= function(s){
        var day, tz,
        rx=/^(\d{4}\-\d\d\-\d\d([tT ][\d:\.]*)?)([zZ]|([+\-])(\d\d):(\d\d))?$/,
        p= rx.exec(s) || [];
        if(p[1]){
            day= p[1].split(/\D/);
            for(var i= 0, L= day.length; i<L; i++){
                day[i]= parseInt(day[i], 10) || 0;
            };
            day[1]-= 1;
            day= new Date(Date.UTC.apply(Date, day));
            if(!day.getDate()) return NaN;
            if(p[5]){
                tz= (parseInt(p[5], 10)*60);
                if(p[6]) tz+= parseInt(p[6], 10);
                if(p[4]== '+') tz*= -1;
                if(tz) day.setUTCMinutes(day.getUTCMinutes()+ tz);
            }
            return day;
        }
        return NaN;
    }
}
else{
    Date.fromISO= function(s){
        return new Date(s);
    }
}
})()
以下功能适用于IE 8及以下版本

// parse ISO format date like 2013-05-06T22:00:00.000Z
 function convertDateFromISO(s) {
 s = s.split(/\D/);
  return new Date(Date.UTC(s[0], --s[1]||'', s[2]||'', s[3]||'', s[4]||'', s[5]||'', s[6]||''))
  }
您可以进行如下测试:

   var currentTime = new Date(convertDateFromISO('2013-05-06T22:00:00.000Z')).getTime();
   alert(currentTime);
我跑了
”‎11‎/‎06‎/‎2015“.split(“”).map(函数){return s.charCodeAt(0)})
(获取Unicode值)在我的控制台中,发现了一些有趣的东西:
[8206,49,49,8206,47,8206,48,54,8206,47,8206,50,48,49,53]

你有一个在那里。我不知道它是怎么到那里的

把它拿走,你会没事的


在这里,您可以复制并粘贴我的字符串:
“11/06/2015”

Scimonster巧妙地解决了您的问题,dan解释了如何剥离非ASCII字符,但有一种更简单的方法:只需使用只匹配数字的正则表达式。这样,您就不必使用
split
trim
或去掉任何东西:

函数go(){ var newDate=”‎11‎/‎06‎/‎2015"; var expr=/\d+/g; var parts=newDate.match(expr); document.getElementById(“结果”).innerHTML= “零件:”+零件+ “
年份:”+部分[0]+ “
月份:”+部分[1]+ “
天:”+部分[2]; }
试试我

也许这不是解决方案,但为什么不尝试通过以下操作获取日期:
var day=date[0]+date[1]我尝试了你的代码,当我重新键入日期时,它工作正常,也许你有一些不可输入的字符。有趣的是,我的编辑使问题消失了。它不再在Chrome中显示奇怪的字符。但是是的,字符串中有无法打印的字符。如果编辑代码,并将光标放在其中一个
/
之后,然后按delete键,您将注意到
/
未被删除。这意味着还有其他角色被删除了。你用什么作为编辑器?日期字符串是从哪里复制的?
parseInt
将字符串解析为数字。在数字上使用它毫无意义,并且可能会导致问题,例如
parseInt(1e300,10)
。您可以使用以下命令删除所有非ASCII字符:
newDate.replace(/[^\x00-\x7F]/g,”)
我会接受这个答案,主要是因为有注释。这个:newDate.replace(/[^\x00-\x7F]/g,“”)使一切重新开始,它是最简单、最快速的。您也可以只做
var parts=newDate.match(/\d+/g)
不管有什么外来字符,它都会返回
[“11”、“06”、“2015”]
。如果我能加倍投票,我会的。乔丹,干得好!这个问题困扰了我将近一天,直到我把IE添加到搜索中并找到了这个。奇怪的是,这只发生在IE中。
   var currentTime = new Date(convertDateFromISO('2013-05-06T22:00:00.000Z')).getTime();
   alert(currentTime);