【问题标题】:Moment js getting next date given specified week day时刻js在给定的工作日获取下一个日期
【发布时间】:2013-10-06 16:18:30
【问题描述】:

在给定特定日期的情况下,我似乎在获取前一个星期一时遇到了一些问题。我正在尝试使用 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 日。

这里有人知道吗?谢谢。

【问题讨论】:

    标签: javascript momentjs


    【解决方案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

    【讨论】:

    • 最新时刻,您可以使用当天本身的名称,例如 moment().day("Monday")
    【解决方案2】:

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

    首先,您想知道所讨论的日期是小于还是大于您想要的日期。如果它更大,你想在下周使用。如果较小,您可以使用同一周的星期一或星期四。

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

    如果我们已经过了我们想要的那一天(例如,如果我们的 Moment 是星期五,而我们想要下一个星期四),那么您需要一个解决方案,该解决方案将为您提供“我们之后的一周中的星期四”时刻”,无论我们的时刻是哪一天,都没有任何必要的加法/减法。简而言之,您想先进入下周,使用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

    【讨论】:

      【解决方案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'), 5)) // 2019-10-11
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-03-22
          • 1970-01-01
          • 2011-07-28
          • 1970-01-01
          • 2010-12-07
          • 1970-01-01
          • 2014-04-30
          相关资源
          最近更新 更多