在Javascript中拆分字符串的奇怪行为
我试着做一些相对简单的事情。我的日期格式为dd/MM/yyyy,例如:在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
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);