Strange Behaviour With Spliting A String In Javascript
Solution 1:
I ran "11/06/2015".split('').map(function(s){return s.charCodeAt(0)})
(to get the Unicode values) in my console, and found something interesting: [8206, 49, 49, 8206, 47, 8206, 48, 54, 8206, 47, 8206, 50, 48, 49, 53]
You have a U+200E left-to-right mark in there. I don't know how it got there.
Remove it, and you'll be fine.
Here, you can copy and paste the string from me: "11/06/2015"
.
Solution 2:
Scimonster astutely figured out your problem, and dan explained how to strip non-ASCII characters, but there's an easier way: Just use a regular expression that matches digits only. That way you don't have to use split
or trim
or strip anything out:
functiongo() {
var newDate = "11/06/2015";
var expr = /\d+/g;
var parts = newDate.match(expr);
document.getElementById("result").innerHTML =
"Parts: " + parts +
"<br>Year: " + parts[0] +
"<br>Month: " + parts[1] +
"<br>Day: " + parts[2];
}
<buttononclick="go()">Try me</button><divid="result"/>
This will work whether your string is "11/06/2015"
or "11-6-2015"
or junk11/06/2016junk
.
Solution 3:
For older browsers, you need to write a function that will parse the string.
The following function will create a Date.fromISO
method- if the browser can natively get the correct date from an ISO string, the native method is used.Some browsers got it partly right, but returned the wrong timezone, so just checking for NaN may not do.
(function(){
var D= newDate('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= newDate(Date.UTC.apply(Date, day));
if(!day.getDate()) returnNaN;
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;
}
returnNaN;
}
}
else{
Date.fromISO= function(s){
returnnewDate(s);
}
}
})()
Result will be:
var start_time = '2012-06-24T17:00:00-07:00';
var d = Date.fromISO(start_time);
var month = d.getMonth();
var day = d.getDate();
alert(++month+' '+day); // returns months from 1-12
Below function worked for IE 8 and below.
// parse ISO format date like 2013-05-06T22:00:00.000ZfunctionconvertDateFromISO(s) {
s = s.split(/\D/);
returnnewDate(Date.UTC(s[0], --s[1]||'', s[2]||'', s[3]||'', s[4]||'', s[5]||'', s[6]||''))
}
You can test like below:
var currentTime = newDate(convertDateFromISO('2013-05-06T22:00:00.000Z')).getTime();
alert(currentTime);
Post a Comment for "Strange Behaviour With Spliting A String In Javascript"