toISOString() changes datetime value

后端 未结 2 1286
花落未央
花落未央 2021-01-04 11:31

I have array of the objects.Each object in array has date property.I try to get biggest(the last) date from array.

Here is array:

var sensorsData = [         


        
相关标签:
2条回答
  • 2021-01-04 12:08

    When you create a date with new Date(str) it creates a date object with a time zone. toISOString() makes it zero UTC offset, as denoted by the suffix "Z".

    Here is a workaround:

    var date = new Date(e.MeasureDate)
    return new Date(date.getTime() - date.getTimezoneOffset() * 60000)
    

    Updated fiddler: https://jsfiddle.net/xf5jmLL6/7

    getTimezoneOffset returns number of minutes and new Date expects number of milliseconds since January 1 1970 00:00:00 UTC, so multiplying by 60000 provides needed adjustment.

    0 讨论(0)
  • 2021-01-04 12:12

    The problem lay in that this process (that makes date conversion to integers than back to dates) is not reversible the proof is in the following function that performs conversion from dates to int and then back to dates, only to get different values from the starting ones

    <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>

    My solution is pretty simple : comparing dates as are, and returning the result

    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>
    <button onclick="setDate()">update date</button>

    0 讨论(0)
提交回复
热议问题