Creo que el constructor Date() es demasiado poco confiable con las cadenas como entrada.
@Garrett describe el problema aquí -
una manera confiable de establecer una fecha es para construir uno y utilizar los métodos setFullYear y setTime.
le da un vínculo, una función, y más detalles aquí: https://stackoverflow.com/a/2182529/644492
he modificado la función de tomar una entrada completa de series ISO DateTime UTC y devolver un objeto UTC, plazo que se pueda manipular con Fecha getters.
Bajé milisegundos porque el constructor Fecha IE8 no agrega milisegundos.
mis modificaciones son, probablemente, no es perfecto - expresión regular es un poco flojo en el extremo, y que el bloque de comprobar formato probable que necesite ser cambiado para mi nuevo formato de entrada ...
/**Parses string formatted as YYYY-MM-DDThh:mm:ss.sZ
* or YYYY-MM-DDThh:mm:ssZ (for IE8), to a Date object.
* If the supplied string does not match the format, an
* invalid Date (value NaN) is returned.
* @param {string} dateStringInRange format YYYY-MM-DDThh:mm:ss.sZ,
* or YYYY-MM-DDThh:mm:ssZ - Zulu (UTC) Time Only,
* with year in range of 0000-9999, inclusive.
* @return {Date} Date object representing the string.
*/
function parseISO8601(dateStringInRange) {
var isoExp = /^\s*(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d).*Z\s*$/,
date = new Date(NaN), month,
parts = isoExp.exec(dateStringInRange);
if (parts) {
month = +parts[2];
date.setUTCFullYear(parts[1], month - 1, parts[3]);
date.setUTCHours(parts[4]);
date.setUTCMinutes(parts[5]);
date.setUTCSeconds(parts[6]);
if(month != date.getUTCMonth() + 1) {
date.setTime(NaN);
}
}
return date;
}
Una corrección: 'si (month! = date.getMonth() + 1) 'debe ser' if (month! = date.getUTCMonth() + 1) '. – Grinn