Not passing strings to the Date constructor, as you know, is bad when parsing strings. IE 8, for example, will not parse ISO 8601 format strings and return NaN. Itβs very simple to write your own parser:
function parseISOString(s) { var b = s.split(/\D+/); return new Date(Date.UTC(b[0], --b[1], b[2], b[3], b[4], b[5], b[6])); }
Note also that if the time is 19: 38: 34.203 UTC, and your time zone is UTC +0530, then the time in this time zone is 01:08:34 in the morning the next day, therefore, the difference in dates. For example, for a person on the east coast of Australia, but not observing daylight saving time (i.e. UTC +10), this is equivalent to:
4 November, 2014 05:38:34
Edit
So, if you want to return it to the ISO date, you can use the getISO * methods to create any format that suits, for example
function isoFormatDMY(d) { function pad(n) {return (n<10? '0' : '') + n} return pad(d.getUTCDate()) + '/' + pad(d.getUTCMonth() + 1) + '/' + d.getUTCFullYear(); } var s = '2014-11-03T19:38:34.203Z'; var date = parseISOString(s); console.log(isoFormatDMY(date))
or use ES5 toISOString :
parseISOString('2014-11-03T19:38:34.203Z').toISOString();
Simple polyfill for ES5 preview browsers:
if (!Date.prototype.toISOString) { Date.prototype.toISOString = function() { var d = this; // Padding functions function pad(n) {return (n<10? '0' : '') + n} function padd(n){return (n<100? '0' : '') + pad(n)} return d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate()) + 'T' + pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()) + ':' + pad(d.getUTCSeconds()) + '.' + padd(d.getMilliseconds()) + 'Z'; } }