У меня есть массив дат, и я хочу сделать с ним две вещи.
1.- Скажите, сколько дат в нем выходных? 2.- Создайте новую договоренность с датами, выходными
Я попробовал следующий код, но я не знаю, как вернуться, когда выходные истинны, поскольку вы можете видеть, что код оценивает только, когда getDay равен 0 (воскресенье) и 6 (суббота), мне нужно было бы найти способ поставить те, которые верны внутри массива
const attendanceDates = [
"2022-11-21",
"2022-11-22",
"2022-11-24",
"2022-11-26"
]
const whenIsWeekend = [];
attendanceDates.forEach(element => {
const date = new Date(element)
var dayOfWeek = date.getUTCDay();
var isWeekend = (dayOfWeek === 6) || (dayOfWeek === 0); // 6 = Saturday, 0 = Sunday
console.info('isWeekend', isWeekend);
if (isWeekend) {
whenIsWeekend.push(element)
}
})
console.info('array of Weekend', whenIsWeekend)
console.info('count weekends', whenIsWeekend.length)
Что я надеюсь вернуть
array of Weekend [
"2022-11-26"
]
count weekends 1
Спасибо заранее
Я немного смущен, потому что ваш код работает. Единственная проблема связана с часовыми поясами, поскольку ваш массив whenIsWeekend
может возвращать неправильный день в зависимости от часового пояса пользователя. Но это легко исправить, используя .getUTCDay()
вместо .getDay()
.
Это то, что он возвращает день «2022-11-21», и этого не должно быть, потому что дата 21 не является выходным днем в договоренности, выходные - 2022-11-26, что бы он оценивал на "6" с getDay, поэтому меня смущает поведение
@Izlia Использование .getUTCDay()
решает эту проблему. Также вам, вероятно, следует использовать .forEach()
вместо .map()
. Обычно вы используете карту только для изменения массива, но в этом случае вы просто перебираете его и добавляете значения в отдельный массив.
Да! Вот и все! Я не знал, что часовой пояс может быть затронут. Управление датами - это головная боль для меня, спасибо и извините за неудобства!
Использование собственного объекта даты Javascript:
const attendanceDates = [
"2022-11-21",
"2022-11-22",
"2022-11-24",
"2022-11-26"
]
const weekends = attendanceDates.filter(date => {
const dateObj = new Date(date)
const dayOfWeek = dateObj.getUTCDay();
if (dayOfWeek == 0 || dayOfWeek == 6) {
return true;
}
})
console.info(weekends) //["2022-11-26"]
Использование библиотеки moment.js (идеально, если вам нужно легко выполнять множество манипуляций с датами)
const attendanceDates = [
"2022-11-21",
"2022-11-22",
"2022-11-24",
"2022-11-26"
]
const weekends = attendanceDates.filter(date => {
const dateMoment = moment(date)
if (dateMoment.day() == 0 || dateMoment.day() == 6) {
return true;
}
})
console.info(weekends) //["2022-11-26"]
Идеальный! Это все, спасибо! Я не знал, что часовой пояс может вызвать проблемы при проведении тура, и это была моя ошибка.
Я что-то упустил, ваш код уже возвращает то, что вы сказали, и ожидаете, что он вернется?