在指定的工作日获得下一个日期的时刻

时间:2013-09-30 17:37:47

标签: javascript momentjs

在给定特定日期的前一个星期一,我似乎遇到了一些问题。我正在尝试使用Moment js完成任务。显然,我可以手工完成,但发现很奇怪我无法使用他们网站上的moment.js文档中的示例:http://momentjs.com/docs/#/get-set/day/

我正在尝试类似的事情:

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

导致'两天前'的日期,即9月13日而不是预期的9月9日。

有人在这里有线索吗?感谢。

4 个答案:

答案 0 :(得分:56)

以下是它的工作原理:

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

答案 1 :(得分:14)

只有当您已经知道有关日期是在本周还是下周时,才能使用已接受的答案。如果你不知道怎么办?您需要在任意日期之后的下一个星期四吗?

首先,您想知道相关日期是否比您想要的日期更小或更大。如果它更大,你想在下周使用。如果它更小,您可以在周一或周四使用同一周。

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

如果我们已经过了我们想要的那一天(例如,我们的时刻是星期五,我们希望下周四可用),那么你想要一个能给你&#34;星期四的解决方案在我们这个时刻之后的一周#34;,无论我们的那一天是什么日子,没有任何必要的加/减。简而言之,您希望首先使用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

答案 2 :(得分:1)

我认为关键是,使用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
  }
}

答案 3 :(得分:0)

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