【问题标题】:Moment js get specific day of a month by week and day of weekMoment js按星期和星期几获取一个月中的特定日期
【发布时间】:2017-12-16 18:53:51
【问题描述】:

如何使用moment js获取给定月份的第二个星期二或给定月份的第三个星期四。

我尝试寻找解决方案,但没有成功。我自己编写并在下面发布了答案,如果您有更好的解决方案,您可以回答您的实施。

【问题讨论】:

  • 可能我没有完全理解您的要求,但请参阅here(和here)以获得类似问题的可能解决方案。
  • 他们只在某一天工作。我的要求是任何一周中的任何一天。
  • 在链接的答案中,星期几是“硬编码”的,但我认为从该答案开始很容易获得更通用的解决方案。无论如何,我已经发布了一个更新的答案,我试图获得任何一周中的任何一天

标签: javascript jquery angularjs momentjs knockout-2.0


【解决方案1】:

这里是我在 cmets 中链接的答案的更新版本。我已经使用weekday 来使用支持区域设置的星期几,如果您总是希望星期天为 0,星期六为 6,您可以使用day

var getGivenDateOfMonth = function (startDate, dayOfWeek, weekNumber) {
  // Start of the month of the given startDate
  var myMonth = moment(startDate).startOf('month');
  // dayOfWeek of the first week of the month
  var firstDayOfWeek = myMonth.clone().weekday(dayOfWeek);
  // Check if first firstDayOfWeek is in the given month
  if( firstDayOfWeek.month() != myMonth.month() ){
      weekNumber++;
  }
  // Return result
  return firstDayOfWeek.add(weekNumber-1, 'weeks');
}

// Examples
var secondMondayOfJuly = getGivenDateOfMonth('2017-07-10', 1, 2);
console.log(secondMondayOfJuly.format());
var thirdFridayOfJuly = getGivenDateOfMonth('2017-07-10', 5, 3);
console.log(thirdFridayOfJuly.format());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

【讨论】:

    【解决方案2】:
    //get a preferred day of a month
    var getGivenDateOfMonth = function (startDate, dayOfWeek, weekNumber) {
                var startOfMonth = moment(startDate).utc().startOf('month').startOf('isoweek');
                var dayOne = moment((moment(startDate, "YYYY-MM-DD").format("YYYY-MM") + "-01"),"YYYY-MM-DD");
                var studyDate;
                if (dayOne.isoWeekday() === 1) {
                    studyDate = moment(startDate).utc().startOf('month').startOf('isoweek').add(dayOfWeek - 1, 'days')
                        .add(weekNumber, 'w');
                }
                else if (dayOne.isoWeekday() <= dayOfWeek) {
                    studyDate = moment(startDate).utc().startOf('month').startOf('isoweek').add(dayOfWeek - 1, 'days')
                        .add(weekNumber - 1, 'w');
                } else {
                    studyDate = moment(startDate).utc().startOf('month').startOf('isoweek').add(dayOfWeek - 1, 'days')
                        .add(weekNumber, 'w');
                }
                if (studyDate.month() == startOfMonth.month()) {
                    studyDate = studyDate.subtract(1, 'w');
                }
                return studyDate;
            };
    

    startDate 是给定月份的日期。
    dayOfWeek 是 js ISO 星期几,
    weeknumber 是你想要的周数(1,2,3,4)

    【讨论】:

      【解决方案3】:

      function nthDayOfMonth(month, year, day, weekNum){
         var nearestDay = moment(month + " " + year,"M YYYY").day(day);
         var nthDay = nearestDay.add(nearestDay.isSame(moment({month: month}),"month") ? weekNum - 1  : weekNum ,"weeks");
         return nthDay;
      }
      
      document.write(nthDayOfMonth(7,2017,3,3).format("L"));
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

      【讨论】:

        【解决方案4】:

        获取本月第二个星期二的日期:

        var date = new Date();
        var month_week = 2;	// 2nd Week
        var week_day = 2;	// Tuesday
        
        var first_week = moment(date).startOf("month").day(week_day);
        var result = first_week.add(7 * (month_week - 1), "days");
        
        console.log(result);
        &lt;script src="https://momentjs.com/downloads/moment.min.js"&gt;&lt;/script&gt;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-07
          • 1970-01-01
          • 2013-02-15
          相关资源
          最近更新 更多