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 сентября.
Есть ли у кого-нибудь ключ? Спасибо.
Ответы
Ответ 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