Javascript: получить объект с диапазоном дат в массиве, который соответствует текущему времени

#javascript #arrays #date

#javascript #массивы #Дата

Вопрос:

Пожалуйста, поправьте меня, если этот вопрос уже задавался в Stack, но я не нашел ответа, который решил бы мою проблему. Я хочу отображать только объект моего массива, где диапазон дат, состоящий из timeStart и timeEnd , соответствует текущему времени. Допустим, текущее время будет 2020-10-22T16:35:45 01:00 , функция должна отображать назначение Стива (см. Пример, приведенный Ниже). Как я могу выполнить поиск объекта, в котором текущее время находится между заданными диапазонами дат?

 const currentTime = Date.now(); // 2020-10-22T16:35:45 01:00
  

Это массив, с которым я работаю:

 [
    {
        name: "Thomas",
        timeStart: "2020-10-22T16:00:00 0100",
        timeEnd: "2020-10-22T16:15:00 01:00"
    },
    {
        name: "Marc",
        timeStart: "2020-10-22T16:15:00 0100",
        timeEnd: "2020-10-22T16:30:00 01:00"
    },
    {
        name: "Steve",
        timeStart: "2020-10-22T16:30:00 0100",
        timeEnd: "2020-10-22T16:45:00 01:00"
    }
]
  

Ответ №1:

Сравните начальную, конечную и текущую даты внутри find цикла.
Если сравнение возвращает true, то будет возвращен текущий объект, в противном undefined случае.

 const now = new Date("2020-10-22T16:17:00 01:00"); // 16:17. Should be Marc.

const dates = [
    {
        name: "Thomas",
        timeStart: "2020-10-22T16:00:00 0100",
        timeEnd: "2020-10-22T16:15:00 01:00"
    },
    {
        name: "Marc",
        timeStart: "2020-10-22T16:15:00 0100",
        timeEnd: "2020-10-22T16:30:00 01:00"
    },
    {
        name: "Steve",
        timeStart: "2020-10-22T16:30:00 0100",
        timeEnd: "2020-10-22T16:45:00 01:00"
    }
];

const result = dates.find(({ timeStart, timeEnd }) => {
  const start = new Date(timeStart);
  const end = new Date(timeEnd);
  return start <= now amp;amp; end > now;
});

console.log(result);  

Ответ №2:

Это работает для вас? Он выполняет поиск по каждой дате и проверяет, что текущая дата находится между началом и концом.

 const currentTime = Date.now(); // 2020-10-22T16:35:45 01:00

const dates = [{
    name: "Thomas",
    timeStart: "2020-10-22T16:00:00 0100",
    timeEnd: "2020-10-22T16:15:00 01:00"
  },
  {
    name: "Marc",
    timeStart: "2020-10-22T16:15:00 0100",
    timeEnd: "2020-10-22T16:30:00 01:00"
  },
  {
    name: "Steve",
    timeStart: "2020-10-22T16:30:00 0100",
    timeEnd: "2020-10-22T16:45:00 01:00"
  }
];

// If you want only one result, use find instead of filter
const validDates = dates.filter((obj) => {
  // Converts strings to Dates
  let startDate = new Date(obj.timeStart);
  let endDate = new Date(obj.timeEnd);
  // Makes sure the current time is after the start date and before the end date
  return currentTime >= startDate amp;amp; currentTime <= endDate;
});

console.log(validDates);

// To get name, use validDates[0].name (for filter, see above) or validDates.name (for find)  

Ответ №3:

Это будет что-то вроде этого:

 const currentTime = Date.now();

const resultArray=yourArray.filter(item=>{
      // you have to format dates to be able to compare them
      return item.timeStart < currentTime amp;amp; item.timeEnd > currentTime
      });
  

Ответ №4:

Попробуйте что-то вроде этого YourArray.filter(item => currentTime >= item.TimeStart amp;amp; currenttime <= timeEnd)