Найти следующий экземпляр данного дня недели (например, понедельник) с помощью moment.js

Я хочу получить дату следующего понедельника или четверга (или сегодня, если это понедельник или четверг). Поскольку Moment.js работает в рамках воскресенья - субботы, мне нужно разработать текущий день и рассчитать следующий понедельник или четверг на основе этого:

if (moment().format("dddd")=="Sunday") { var nextDay = moment().day(1); }
if (moment().format("dddd")=="Monday") { var nextDay = moment().day(1); }
if (moment().format("dddd")=="Tuesday") { var nextDay = moment().day(4); }
if (moment().format("dddd")=="Wednesday") { var nextDay = moment().day(4); }
if (moment().format("dddd")=="Thursday") { var nextDay = moment().day(4); }
if (moment().format("dddd")=="Friday") { var nextDay = moment(.day(8); }
if (moment().format("dddd")=="Saturday") { var nextDay = moment().day(8); }

Это работает, но, конечно же, лучший способ!

Ответ 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);

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

Ответ 2

moment().day() даст вам номер, относящийся к day_of_week.

Что еще лучше: moment().day(1 + 7) и moment().day(4 + 7) даст вам следующий понедельник и следующий четверг соответственно.

Подробнее: http://momentjs.com/docs/#/get-set/day/

Ответ 3

Следующие данные могут использоваться для получения любой следующей даты дня недели (или любой даты)

var weekDayToFind = moment().day('Monday').weekday(); //change to searched day name

var searchDate = moment(); //now or change to any date
while (searchDate.weekday() !== weekDayToFind){ 
  searchDate.add(1, 'day'); 
}

Ответ 4

получить следующий понедельник, используя момент

moment().startOf('isoWeek').add(1, 'week');

Ответ 5

ИМХО более элегантный способ:

var setDays = [ 1, 1, 4, 4, 4, 8, 8 ],
    nextDay = moment().day( setDays[moment().day()] );

Ответ 6

Здесь, например, в следующий понедельник:

var chosenWeekday = 1 // Monday

var nextChosenWeekday = chosenWeekday < moment().weekday() ? moment().weekday(chosenWeekday + 7) : moment().weekday(chosenWeekday)

Ответ 7

Большинство из этих ответов не касаются вопроса ОП. Андрей Кузьмин - лучший, но я бы немного улучшил его, поэтому алгоритм учитывает локаль.

var nextMoOrTh = moment().isoWeekday([1,4,4,4,8,8,8][moment().isoWeekday()-1]);

Ответ 8

Здесь вы найдете решение найти следующий понедельник или сегодня, если это понедельник:

const dayOfWeek = moment().day('monday').hour(0).minute(0).second(0);

const endOfToday = moment().hour(23).minute(59).second(59);

if(dayOfWeek.isBefore(endOfToday)) {
  dayOfWeek.add(1, 'weeks');
}

Ответ 9

Идея похожа на XML, но избегает оператора if/else, просто добавляя пропущенные дни в текущий день.

const desiredWeekday = 4; // Thursday
const currentWeekday = moment().isoWeekday();
const missingDays = ((desiredWeekday - currentWeekday) + 7) % 7;
const nextThursday = moment().add(missingDays, "days");

Мы идем "в будущее", только добавляя количество дней между 0 и 6.