Moment js按星期和星期几获取一个月中的特定日期

Posted

技术标签:

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

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

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

【问题讨论】:

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

【讨论】:

以上是关于Moment js按星期和星期几获取一个月中的特定日期的主要内容,如果未能解决你的问题,请参考以下文章

获取一周中特定日期的下一个日期

Luxon js从工作日数中获取日期

如何找到一个月中的特定日期?

js获取当前月的1号是星期几

js来获取当前星期几和之前的星期

根据日期字符串获取星期几,日期获取星期,时间获取星期,js获取星期