toISOString()更改日期时间值

时间:2017-08-20 08:08:34

标签: javascript datetime timezone

我有对象的数组。数组中的每个对象都有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函数会返回错误的结果吗?

2 个答案:

答案 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;
&#13;
&#13;

我的解决方案非常简单:比较日期,并返回结果

&#13;
&#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;
&#13;
&#13;