Tengo esta matriz de objetos:
var data=[{Id:540, MeasureDate:"2016-06-27T15:06:47"}, {Id:541, MeasureDate:"2016-06-27T12:24:39"}];
Yo llamo a esta función:
var latestdate = updateLatestDate(data); function updateLatestDate(sensorsData) { return new Date(Math.max.apply(null, sensorsData.map(function (e) { return new Date(e.MeasureDate); }))).toISOString(); }
La función updateLatestDate
devuelve la fecha más reciente y la convierte a ISOString()
.
Pero el problema es que obtengo resultados diferentes si lo uso en Chrome y en IE11.
En Chrome, la variable latestdate
es “2016-06-27T15: 06: 47.000Z”
En IE, la variable latestdate
es “2016-06-27T12: 06: 47.000Z”
La función updateLatestDate
funciona perfectamente en chrome
pero devuelve un resultado incorrecto en IE
, me parece que el problema podría estar en la función Math.max.apply
.
¿Alguna idea de por qué obtengo resultados incorrectos en IE y cómo puedo solucionarlo?
La razón es que no tiene una zona horaria especificada en su marca de hora ISO8601. Chrome se establece de forma predeterminada en UTC e IE en local cuando no se especifica (o al revés, lo olvido).
Tu también puedes:
a) agregue ‘Z’ al final de su marca de tiempo para especificar UTC o agregue otra zona horaria (vea wikipedia para ver los formatos válidos https://en.m.wikipedia.org/wiki/ISO_8601 )
b) use momentjs que creo que estandarizará el comportamiento en los navegadores.
Como lo menciona el momento @elliot te puede ayudar. Compruebe esta solución:
(function() { var data = [{ Id: 540, MeasureDate: "2016-06-27T13:06:47" }, { Id: 541, MeasureDate: "2016-06-27T12:24:39" }, { Id: 540, MeasureDate: "2016-06-27T13:16:47" }]; function getMaxInArray(items, max) { if (items.length) { var item = items.splice(0, 1)[0]; return getMaxInArray(items, Math.max(item, !!max ? max : item)); } return max; } var dates = data.map(function(x) { return moment(x.MeasureDate); }); var latest = moment(getMaxInArray(dates)); console.log(latest.format()); }());