Как я могу получить даты, которым присвоено название дня недели в Javascript?

#javascript #date #datetime

#javascript #Дата #дата и время

Вопрос:

Предположим, у меня есть название дня недели, подобное 'Wednesday' или 'Monday' , есть ли способ вернуть даты месяца, связанные с данным днем недели?

Например, в приведенном ниже календаре есть ли способ получить даты [2,9,16,23,30] для дня «Среда» в сентябре 2020 года? Решение не обязательно должно точно соответствовать этому, если оно возвращает правильные даты для данного дня:

введите описание изображения здесь

Ответ №1:

Попробуйте это

 const dayNames = "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),
  days = [...Array(32).keys()].splice(1); // generate 1-31
const getDates = (yyyy, mm, dayName) => {
  const dayNumber = dayNames.indexOf(dayName);
  mm -= 1; // JS months start at 0
  return days.filter(d => {
    const date = new Date(yyyy, mm, d);
    return mm === date.getMonth() amp;amp; dayNumber === date.getDay()
  });
};

console.log(
  getDates(2020, 9, "Wednesday")
)
console.log(
  getDates(2020, 9, "Monday")
)  

 /* Without the need for a dayName array but needing the month name as input

**NOTE** this was more for my own entertainment - the date constructor may fail on some browsers that does not like `new Date("Monday, August 31")` such as Safari
*/

const fm = new Intl.DateTimeFormat('en-US',{dateStyle:"full"}),
    days = [...Array(32).keys()].splice(1); // generate 1-31

const getDates = (yyyy, monthName, dayName) => {
    const mn = monthName.slice(0,3);
    return days.filter(d => {
      const [,dn,month,day] = fm.format(new Date(`${mn} ${d}, ${yyyy}`)).match(/(w ?), (w ?) (d ?),/)
      return dayName===dn amp;amp; monthName === month;
    });
};
console.log(
  getDates(2020, "September", "Wednesday")
)
console.log(
  getDates(2020, "August", "Monday")
);    

Комментарии:

1. YW — обычно мы ожидаем некоторых усилий со стороны пользователя, но это было слишком весело, чтобы отказаться

2. Возможно, я мог бы создать его без необходимости в массиве dayName

3. Я использую массив dates, чтобы сопоставить их с соответствующими днями в расписании, в котором есть только параметр day, вот почему я использую dayName

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

5. У меня нет числового значения mn во втором примере