为什么我从功能中得到错误的结果?

时间:2016-06-19 17:38:25

标签: javascript cross-browser

我有这个对象数组:

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”

函数updateLatestDatechrome中效果很好但在IE中返回错误的结果,在我看来问题可能出在Math.max.apply 功能

我知道为什么我的错误导致了IE,我该如何解决?

2 个答案:

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

}());

http://plnkr.co:80/oeMDJYzDGkgm4cX4NIpo