2016-06-19 65 views
0

我有这个对象数组:为什么我从函数中得到错误的结果?

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中使用它,我会得到不同的结果。

在铬的latestdate变量是“2016-06-27T15:06:47.000Z”

在IE中latestdate变量是“2016-06-27T12:06:47.000Z”

功能updateLatestDate完美chrome但它返回错误结果IE,在我看来,这个问题可能与Math.max.apply 功能。

任何想法,为什么我在IE中得到错误的结果,我该如何解决它?

预先感谢您!

回答

1

原因是您没有在ISO8601时间戳中指定时区。 Chrome默认为UTC和IE,当它没有被指定时(或者其他方式,我忘记了)。

您可以:

一)增加“Z”你的时间戳指定UTC或添加其他时区的结束(见维基百科有效格式https://en.m.wikipedia.org/wiki/ISO_8601

B)使用momentjs我相信将标准化跨浏览器的行为。

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()); 

}()); 

http://plnkr.co:80/oeMDJYzDGkgm4cX4NIpo

相关问题