2016-06-19 64 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

相關問題