我有这个对象数组:
var data=[{Id:540, MeasureDate:"2016-06-27T15:06:47"},
{Id:541, MeasureDate:"2016-06-27T12:24:39"}];
我称之为此功能:
var latestdate = updateLatestDate(data);
function updateLatestDate(sensorsData) {
return new Date(Math.max.apply(null, sensorsData.map(function (e) {
return new Date(e.MeasureDate);
}))).toISOString();
}
函数updateLatestDate
返回最新日期并将其转换为ISOString()
。
但问题是,如果我在Chrome和IE11中使用它,我会得到不同的结果。
在Chrome中,latestdate
变量“2016-06-27T15:06:47.000Z”
在IE中,latestdate
变量“2016-06-27T12:06:47.000Z”
函数updateLatestDate
在chrome
中效果很好但在IE
中返回错误的结果,在我看来问题可能出在Math.max.apply
功能
我知道为什么我的错误导致了IE,我该如何解决?
答案 0 :(得分:1)
原因是您没有在ISO8601时间戳中指定时区。当Chrome未指定时,Chrome默认为UTC,IE默认为本地(反之,我忘了)。
你可以:
a)添加' Z'在时间戳结束时指定UTC或添加其他时区(请参阅维基百科以获取有效格式https://en.m.wikipedia.org/wiki/ISO_8601)
b)使用我认为会标准化浏览器行为的时刻。
答案 1 :(得分:0)
如@elliot提到的那一刻可以帮助你。 检查此解决方案:
(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());
}());