Фильтрация даты в Javascript - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь отфильтровать массив, который содержит дату (преобразованную из строки), которая больше определенной даты ..

_this.downloadData.forEach(_d => _d.LogTime = _d.LogTime.toString());

console.log(_this.downloadData.filter(x=>new Date(x.LogTime) > new Date('3/11/2019 7:29:12 AM')));

Но фильтр всегда возвращает ноль элементов

.

Массив выглядит следующим образом:

[0 … 99]
0:
CPUStat:""
Connectivity:""
DiskStatus:""
HostName:"HOSTname"
LastRebootStatus:null
LogTime:"Mon Mar 11 2019 07:39:12 GMT+0530 (India Standard Time)"

__proto__:
Object

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Большая часть вашей проблемы здесь заключается в том, что формат даты и времени не соответствует ISO 8601. Из-за этого вам нужно очистить дату. LogTime.substring(4,23) + obj.LogTime.substring(28,33) получит важные части из вашей строки. Затем вы можете использовать moment.js (https://momentjs.com),, что необходимо для обработки времени в JavaScript.

Вы можете запустить приведенный ниже код и убедиться, что он работает

// Your example time array
let timeArray = [
  { LogTime:"Mon Mar 11 2019 07:39:12 GMT+0530 (India Standard Time)" },
  { LogTime:"Mon Mar 11 2019 08:39:12 GMT+0530 (India Standard Time)" },
  { LogTime:"Mon Mar 11 2019 09:39:12 GMT+0530 (India Standard Time)" },
  { LogTime:"Mon Mar 11 2019 10:39:12 GMT+0530 (India Standard Time)" }
 ],
 format = "MMM MM YYYY HH:mm:ssZ",
    shouldBeAfter = moment('Mar 11 2019 09:00:12+0530', format),
    result,
    filterDateGreaterThan = function (obj){
      let sDate,
          mDate;
      
      sDate = obj.LogTime.substring(4,23) + obj.LogTime.substring(28,33);
      mDate = moment(sDate, format);
      // console.log(mDate);
      return mDate.isAfter(shouldBeAfter);
    };
 result = timeArray.filter(filterDateGreaterThan);
 console.log(result);
<script src="https://momentjs.com/downloads/moment.min.js"></script>

Код, когда не используется Moment.js

// Your example time array
let timeArray = [
  { LogTime:"Mon Mar 11 2019 07:39:12 GMT+0530 (India Standard Time)" },
  { LogTime:"Mon Mar 11 2019 08:39:12 GMT+0530 (India Standard Time)" },
  { LogTime:"Mon Mar 11 2019 09:39:12 GMT+0530 (India Standard Time)" },
  { LogTime:"Mon Mar 11 2019 10:39:12 GMT+0530 (India Standard Time)" }
 ],
    shouldBeAfter = new Date('Mar 11 2019 09:00:12+0530'),
    result,
    filterDateGreaterThan = function (obj){
      let sDate,
          date;
      
      sDate = obj.LogTime.substring(4,23) + obj.LogTime.substring(28,33);
      date = new Date(sDate);
      return date.valueOf() > shouldBeAfter.valueOf();
    };
 result = timeArray.filter(filterDateGreaterThan);
 console.log(result);
0 голосов
/ 12 марта 2019

Вы должны быть в состоянии решить вашу проблему, добавив часовой пояс к вашему входу. Если вы не предоставите часовой пояс, ваш браузер будет использовать ваш местный часовой пояс. Например, мой часовой пояс - PDT, поэтому я в итоге вижу:

Without Timezone in input:
input  : 3/11/2019 7:29:12 AM
output : Mon Mar 11 2019 07:29:12 GMT-0700 (Pacific Daylight Time)

With Timezone in input:
input  : Mon Mar 11 2019 07:39:12 GMT+0530 (India Standard Time)
output : Sun Mar 10 2019 19:09:12 GMT-0700 (Pacific Daylight Time)

Обратите внимание, что при вводе часового пояса метка времени unix совпадает с выходным.


Я лично использую Часовой пояс момента , чтобы справиться с этими случаями.

Without Timezone in input:
input  : moment.tz("3/11/2019 7:29:12 AM", "Asia/Calcutta").toDate();
output : Mon Mar 11 2019 00:29:12 GMT-0700 (Pacific Daylight Time)

With Timezone in input:
input  : moment.tz("Mon Mar 11 2019 07:39:12 GMT+0530 (India Standard Time)", "Asia/Calcutta").toDate();
output : Mon Mar 11 2019 00:39:12 GMT-0700 (Pacific Daylight Time)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...