Moment js получает следующую дату в указанный день недели

Кажется, у меня проблемы с получением определенного числа в предыдущий понедельник. Я пытаюсь использовать Moment js для этой задачи. Очевидно, я могу сделать это вручную, но мне показалось любопытным, что я не могу заставить его работать, используя пример из документации moment.js на их веб-сайте: http://momentjs.com/docs/#/get-set/day/.

Я пробовал что-то вроде:

moment([2013, 08, 15, 15, 20]).day(-1).format('ddd, MMM DD')

что приводит к дате «два дня назад», то есть 13 сентября вместо ожидаемого 9 сентября.

У кого-нибудь есть ключ к разгадке? Спасибо.


person Tudor Vintilescu    schedule 30.09.2013    source источник


Ответы (3)


Вот как это работает:

moment().day(1) // this monday
moment().day(-6) // last monday, think of it as this monday - 7 days = 1 - 7 = -6

То же самое применимо и в другом направлении:

moment().day(8) // next monday, or this monday + 7 days = 1 + 7 = 8

Ваш код moment().day(-1) можно объяснить следующим образом: в это воскресенье - 1 день = 0-1 = -1 или в эту субботу - 7 дней = 6-7 = -1.

person mechanicalfish    schedule 30.09.2013
comment
С самого последнего момента вы можете использовать само название дня, например moment (). Day (понедельник) - person Sharjeel Ahmed; 22.12.2016

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

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

const dayINeed = 4; // for Thursday
if (moment().isoWeekday() <= dayINeed) { 
  return moment().isoWeekday(dayINeed);
} else...

Если мы уже прошли желаемый день (если, например, наш момент - пятница, а нам нужен следующий доступный четверг), то вам нужно решение, которое даст вам «четверг недели, следующий за нашим моментом», независимо от того, в какой день сейчас наш момент, без какого-либо обязательного добавления / вычитания. Короче говоря, вы хотите сначала перейти на следующую неделю, используя moment().add(1, 'weeks'). На следующей неделе вы можете выбрать любой день этой недели, используя moment().day(1).

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

const dayINeed = 4; // for Thursday

// if we haven't yet passed the day of the week that I need:
if (moment().isoWeekday() <= dayINeed) { 
  // then just give me this week's instance of that day
  return moment().isoWeekday(dayINeed);
} else {
  // otherwise, give me next week's instance of that day
  return moment().add(1, 'weeks').isoWeekday(dayINeed);
}

См. Также: https://stackoverflow.com/a/27305748/800457

person XML    schedule 21.09.2016

Я думаю, дело в том, что, используя day() или isoWeekday(), вы получаете дату на текущей неделе, независимо от того, какой день недели сегодня. Как следствие, свидание, которое вы получите, может быть в прошлом или еще впереди.

Пример:

если сегодня среда, moment().isoWeekday(5).format() вернет дату предстоящей пятницы.

Пока moment().isoWeekday(1).format() вернется в предыдущий понедельник.

Итак, когда вы говорите, что хотите дату, скажем, «последний вторник», эта дата может принадлежать текущей неделе или предыдущей неделе, в зависимости от того, какой день сегодня.

Возможная функция для получения даты последнего dayOfTheWeek:

function getDateOfPreviousDay(dayOfTheWeek) {
  currentDayOfTheWeek = moment().isoWeekday();   
  if ( currentDayOfTheWeek >= dayOfTheWeek ) {
    return moment().isoWeekday(dayOfTheWeek).format(); // a date in the current week
  }
  else {
    return moment().add(-1,'weeks').isoWeekday(dayOfTheWeek).format(); // a date in the previous week
  }
}
person zeroquaranta    schedule 10.01.2017