Ответ 1
Хитрость здесь не в том, чтобы использовать Момент, чтобы перейти к определенному дню с сегодняшнего дня. Это обобщает, так что вы можете использовать его в любой день, независимо от того, где вы находитесь на неделе.
Сначала вам нужно знать, где вы находитесь на неделе: moment.day()
или чуть более предсказуемый (несмотря на локаль) moment().isoWeekday()
.
Используйте это, чтобы узнать, является ли сегодняшний день больше или больше того дня, который вы хотите. Если оно меньше/равно, вы можете просто использовать этот недельный экземпляр понедельника или четверга...
const dayINeed = 4; // for Thursday
const today = moment().isoWeekday();
if (today <= dayINeed) {
return moment().isoWeekday(dayINeed);
}
Но если сегодняшний день больше того дня, который мы хотим, вы хотите использовать тот же день следующей недели: "понедельник следующей недели", независимо от того, где вы находитесь на текущей неделе. Короче говоря, вы хотите сначала перейти на следующую неделю, используя moment().add(1, 'weeks')
week moment().add(1, 'weeks')
. Как только вы перейдете на следующую неделю, вы можете выбрать нужный день, используя moment().day(1)
.
Все вместе:
const dayINeed = 4; // for Thursday
const today = moment().isoWeekday();
// if we haven't yet passed the day of the week that I need:
if (today <= dayINeed) {
// then just give me this week instance of that day
return moment().isoWeekday(dayINeed);
} else {
// otherwise, give me *next week's* instance of that same day
return moment().add(1, 'weeks').isoWeekday(dayINeed);
}
Смотрите также fooobar.com/questions/201893/...
РЕДАКТИРОВАТЬ: другие комментаторы указали, что ОП хотел что-то более конкретное, чем это: следующий из массива значений ("следующий понедельник или четверг"), а не просто следующий случай какого-либо произвольного дня. Ладно, круто.
Общее решение - начало полного решения. Вместо сравнения за один день, мы сравниваем с массивом дней: [1,4]
:
const daysINeed = [1,4]; // Monday, Thursday
// we will assume the days are in order for this demo, but inputs should be sanitized and sorted
function isThisInFuture(targetDayNum) {
// param: positive integer for weekday
// returns: matching moment or false
const todayNum = moment().isoWeekday();
if (todayNum <= targetDayNum) {
return moment().isoWeekday(targetDayNum);
}
return false;
}
function findNextInstanceInDaysArray(daysArray) {
// iterate the array of days and find all possible matches
const tests = daysINeed.map(isThisInFuture);
// select the first matching day of this week, ignoring subsequent ones, by finding the first moment object
const thisWeek = tests.find((sample) => {return sample instanceof moment});
// but if there are none, we'll return the first valid day of next week (again, assuming the days are sorted)
return thisWeek || moment().add(1, 'weeks').isoWeekday(daysINeed[0]);;
}
findNextInstanceInDaysArray(daysINeed);
Я отмечу, что некоторые более поздние постеры предоставили очень простое решение, которое жестко кодирует массив допустимых числовых значений. Если вы всегда ожидаете выполнять поиск в одни и те же дни и не нуждаетесь в обобщении для других поисков, это будет более вычислительно эффективным решением, хотя и не самым простым для чтения и не поддающимся расширению.