我有对象的数组。数组中的每个对象都有date属性。我试着从数组中得到最大的(最后一个)日期。
这是数组:
var sensorsData = [{
Id: 1,
MeasureDate: "2017-08-20T09:52:32"
}, {
Id: 2,
MeasureDate: "2017-08-20T09:54:35"
}, {
Id: 3,
MeasureDate: "2017-08-20T09:56:13"
}];
这里是从上面的数组获取最大日期的函数:
function updateLatestDate(sensorsData) {
return new Date(Math.max.apply(null, sensorsData.map(function(e) {
return new Date(e.MeasureDate);
}))).toISOString();
}
我从updateLatestDate
函数获得的结果是:
2017-08-20T06:56:13.000Z
但很奇怪,因为你可以看到sensorsData对象中没有任何一个属性没有从updateLatestDate
函数返回的日期。
这是FIDDLER。
知道为什么updateLatestDate函数会返回错误的结果吗?
答案 0 :(得分:10)
使用new Date(str)
创建日期时,会创建带有时区的日期对象。 toISOString()
使其为零UTC偏移,由后缀“Z”表示。
这是一种解决方法:
var date = new Date(e.MeasureDate)
return new Date(date.getTime() - date.getTimezoneOffset() * 60000)
更新了提琴手:https://jsfiddle.net/xf5jmLL6/7
getTimezoneOffset
返回分钟数,new Date
预计自1970年1月1日00:00:00 UTC以来的毫秒数,因此乘以60000可提供所需的调整。
答案 1 :(得分:1)
问题在于这个过程(将日期转换为整数而不是回到日期)是不可逆的 证明在以下函数中执行从日期到int的转换然后返回到日期,只是为了从起始值获得不同的值
<button onclick="setDate()">irreversible conversion</button>
<script>
function setDate(){
var sensorsData = [{Id:1,MeasureDate:"2017-08-20T09:52:32" },{Id:2,MeasureDate:"2017-08-20T09:54:35" },{Id:3,MeasureDate:"2017-08-20T09:56:13"}];
function irreversible(){
sensorsData.forEach(function (e){
console.log(
new Date(
new Date(e.MeasureDate).getTime()
)
);
})
}
irreversible();
}
</script>
&#13;
我的解决方案非常简单:比较日期,并返回结果
function setDate(){
var sensorsData = [{Id:1,MeasureDate:"2017-08-20T09:52:32" },{Id:2,MeasureDate:"2017-08-20T09:54:35" },{Id:3,MeasureDate:"2017-08-20T09:56:13"}];
var lastDate = updateLatestDate(sensorsData);
console.log(lastDate.MeasureDate);
function compare(d1,d2){
if (d1.MeasureDate >d2.MeasureDate)
return d1;
else
return d2;
}
function updateLatestDate(sensorsData) {
return ( sensorsData.reduce(compare) );
}
}
</script>
&#13;
<button onclick="setDate()">update date</button>
&#13;