#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 во втором примере