Подтвердить что ты не робот

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 сентября.

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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 instance of that day
  return moment().isoWeekday(dayINeed);
} else {
  // otherwise, give me next week instance of that day
  return moment().add(1, 'weeks').isoWeekday(dayINeed);
}

Смотрите также: fooobar.com/questions/201893/...

Ответ 3

Я считаю, что с помощью 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
  }
}

Ответ 4

function nextWeekday (day, weekday) {
  const current = day.day()
  const days = (7 + weekday - current) % 7
  return day.clone().add(days, 'd')
}

// example: get next Friday starting from 7 Oct 2019

nextWeekday(moment('2019-10-07'), 2)) // 2019-10-11