Могу ли я проверить, произошло ли событие в течение часа, независимо от даты? Момент. js - PullRequest
2 голосов
/ 02 марта 2020

Я отслеживаю использование устройства и показываю пользователям их тенденции использования по часам. По сути, мне нужно просмотреть times документы и проверить, было ли устройство «включено» между 18:00 и 19:00, затем 19:00 и 20:00, 20:00 и 21:00 и т. Д. В течение всех 24 часов.

Это это то, что я изначально написал:

      // loop through 24 hours of the day
      for (let j = 0; j < 24; j++) {
        const beginningOfHour = moment().startOf('day').add(j, 'hour').toDate()
        const endOfHour = moment(beginningOfHour).add({ m: 59, s: 59, ms: 999 }).toDate()

        const cumulativeHours = timePerPeriod(beginningOfHour, endOfHour, myTimes)  // calculation func

        trendsArray.push(cumulativeHours)
      }

Это не работает, потому что к beginningOfHour и endOfHour также прикреплена дата.

Я не могу понять, как проверить мои times документы только за час, без какой-либо ссылки на дату. Любой совет, как это сделать?

РЕДАКТИРОВАТЬ: Вот как выглядит times документ:

_id: 5e56cf9ae65bf2b30a6ab525  // ObjectID type
user_id: 5e56bb2b40ad526200401773  // ObjectID type
start: 2020-02-27T00:00:00.000+00:00  // Date type
stop: 2020-02-27T06:00:00.000+00:00  // Date type

Устройство может быть включено в течение любого периода времени, например, 3 месяца прямо или 15 секунд. Каждый документ time проверяется, и, если он включен в течение какого-либо промежутка времени в течение этого часового периода, длина в миллисекундах, в которой он находился в течение этого часового периода, возвращается моей функцией вычисления (называемой cumulativeHours выше).

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Поскольку вопрос был отредактирован и теперь запрашивает временные диапазоны, перекрывающие друг друга, здесь приходит решение для отредактированной версии. Это очень упрощенный подход, который не учитывает минуты или временные промежутки за несколько дней, но он надеется, что он передает идею. В основном для каждой комбинации временного интервала необходимо проверить все 4 возможности (временные интервалы полностью перекрываются, не перекрываются вообще или только начало или только время окончания между ними):

let sampleDatetimeRanges = [
  {
    start: moment("2013-02-08 09:00"),
    end: moment("2013-02-08 10:00")
  },
  {
    start: moment("2013-02-08 08:00"),
    end: moment("2013-02-08 12:00")
  },
  {
    start: moment("2013-02-08 13:00"),
    end: moment("2013-02-08 18:00")
  } 
];

function isBetweenHours(start, end, hourInQuestion) {
  return start <= hourInQuestion && end >= hourInQuestion;
}


// calculate the timespan between 09:00 and 10:00
const rangeStart = 9;
const rangeEnd = 11;
const hoursCount = sampleDatetimeRanges.map(current => {
  let startHour = current.start.hour();
  let endHour = current.end.hour();
  if (startHour <= rangeStart && endHour >= rangeEnd) { // full time covered
    return rangeEnd - rangeStart;
  } else if (startHour <= rangeStart && isBetweenHours(rangeStart, rangeEnd, endHour)) { // only end time in timespan
    return endHour - rangeStart;
  } else if (isBetweenHours(rangeStart, rangeEnd, startHour) && endHour >= rangeEnd) { // only start time in timespan
    return rangeEnd - startHour;
  } else if (isBetweenHours(rangeStart, rangeEnd, startHour) && isBetweenHours(rangeStart, rangeEnd, endHour)) {
    return endHour - startHour;
  }
  // not in timespan
  return 0;

}).reduce((sum, current) => sum + current, 0)

console.log(`hours covered in the timespan from ${rangeStart} to ${rangeEnd}: ${hoursCount}. `);
<script src="https://unpkg.com/moment@2.24.0/moment.js"></script>
0 голосов
/ 02 марта 2020

Вы можете перебирать время и фильтровать по часу дня и / или минуте отметки времени, используя методы .hour() или .minute() для таких объектов, как этот (для простоты я проверяю только час ):

let sampleArrayOfDateTimes = [
  moment("2013-02-08 08:59"),
  moment("2013-02-08 09:00"),
  moment("2013-02-08 09:30"),
  moment("2013-02-08 10:00")
]

// find datetimes between 09:00 (including) and 10:00 (excluding)

let arrayWithTimesBetween9and10 = sampleArrayOfDateTimes.filter(datetime => datetime.hour() == 9);

console.log("the following datetimes are between 09:00 and 09:59");
arrayWithTimesBetween9and10.forEach(datetime => {
  console.log(datetime.format());
});
<script src="https://unpkg.com/moment@2.24.0/moment.js"></script>
...