2012-09-06 28 views
6

.Net WebAPI utiliza el formato ISO DateTime de forma predeterminada cuando serializa un DateTime. Cuando IE8 intenta utilizar este formato ISO DateTime en un nuevo constructor Date(), rompe el retorno de NaN. .Net webApi ISO datetime e IE8

var d = new Date('2012-09-06T15:28:56.215Z'); 
alert(d); 

Firefox maneja esto bien. No he probado Chrome. IE8 se rompe y devuelve NaN.

Supongo que las fechas ISO son un buen formato para usar en mi WebAPI. También quiero que mi cliente de Javascript maneje la conversión a la hora local y vuelva a formatear el DateTime para que sea fácil de leer, es por eso que estoy usando un tipo de fecha y no solo manteniendo la fecha ISO como una cadena.

Dado todo esto, ¿cuál es la mejor forma de manejar el formato ISO DateTime para que IE8 no se ahogue?

Respuesta

2

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; 
} 
+1

Una corrección: 'si (month! = date.getMonth() + 1) 'debe ser' if (month! = date.getUTCMonth() + 1) '. – Grinn

0

No es una solución perfecta, pero this Javascript Date library es capaz de analizar esa fecha si se quita el trailing "Z". No sería difícil extender uno de los patrones incorporados para manejar el aspecto de la zona horaria.