Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaScript获取给定月份中的给定工作日_Javascript_Algorithm_Date - Fatal编程技术网

使用JavaScript获取给定月份中的给定工作日

使用JavaScript获取给定月份中的给定工作日,javascript,algorithm,date,Javascript,Algorithm,Date,我试图得到第n个工作日,例如,一个月的第二个星期日,某个日期 例如,如果日期是2015年8月24日,我想这样做: nthDayOfMonth(0, 2, new Date(2015, 7, 24)) 2015年8月9日(8月第二个星期日)。然后,我希望能够在日期上添加一个月,再次调用该函数,并获得2015年9月13日(9月的第二个星期日) 由于某些原因,下面的代码不起作用 我错过了什么 function nthDayOfMonth(day, n, date) {

我试图得到第n个工作日,例如,一个月的第二个星期日,某个日期

例如,如果日期是2015年8月24日,我想这样做:

nthDayOfMonth(0, 2, new Date(2015, 7, 24))
2015年8月9日(8月第二个星期日)。然后,我希望能够在日期上添加一个月,再次调用该函数,并获得2015年9月13日(9月的第二个星期日)

由于某些原因,下面的代码不起作用

我错过了什么

function nthDayOfMonth(day, n, date) {                                                                                              
    console.log(day);
    console.log(n);
    var count = 0; 
    var idate = new Date(date);                                                                                                       

    idate.setDate(1);                                                                                                                 

    while ((count) < n) {                                                                                                             
      idate.setDate(idate.getDate() + 1);
      if (idate.getDay() == day) {
        count++;                                                                                                                      
      }                                                                                                                               
    }                                                                                                                                 

return idate;                                                                                                                     
函数nthDayOfMonth(day,n,date){
控制台日志(天);
控制台日志(n);
var计数=0;
var idate=新日期(日期);
截止日期(1);
而((计数)

}您的代码似乎工作正常。要添加月份,可以使用
d.setMonth(d.getMonth()+1)

尝试此演示:

函数n月n日(日,n,日期){
变量计数=0,
idate=新日期(日期);
截止日期(1);
while(计数'
+'当月的第二个星期日是
'+res+'
' +'如果您再加上一个月,您将得到
'+plusOne+'
'
+“该月的第二个星期日是
”+res2在增加月份的日期之前,必须检查
idate.getDay()
。否则,如果所需的工作日落在月的第一天,您将得到错误的答案

下面的代码片段演示了正确的函数

功能打印{
文件。写(s+“
”); } 函数nthWeekdayOfMonth(工作日,n,日期){ 变量计数=0, idate=新日期(Date.getFullYear(),Date.getMonth(),1); while(true){ if(idate.getDay()==工作日){ 如果(++count==n){ 打破 } } idate.setDate(idate.getDate()+1); } 返回idate; } //当月的第二个星期日。 变量日期=新日期(); 打印(日期=月的第n个工作日(0,2,日期)); //下个月的第二个星期日。 date.setMonth(date.getMonth()+1); 打印(日期=月的第n个工作日(0,2,日期)); //2015年9月的第一个星期二。 打印(每月第n个工作日(2,1,新日期(2015,8)); //2015年9月的第一个星期三。 打印(每月第n个工作日(3,1,新日期(2015,8)); //2015年9月第二个星期二。 打印(每月第n个工作日(2,2,新日期(2015,8)); //2015年9月第二个星期三。 打印(每月第n个工作日(3、2、新日期(2015、8))
正文{
字体系列:无衬线;

}
我刚刚在Michael Laszlo的优秀答案中添加了一个调整,允许调用者提供n==5(或任何更大的值),以表示需要一个月的最后一个工作日:

function nthWeekdayOfMonth(weekday, n, date) {
  var month = date.getMonth();
  var date = new Date(date.getFullYear(), month, 1),
      add = (weekday - date.getDay() + 7) % 7 + (n - 1) * 7;

  // make sure that we stay in the same month
  do {
    date.setMonth(month);
    date.setDate(1 + add);
    add -= 7;
  } while (date.getMonth() != month);

  return date;
}

你有没有考虑到这个月是以0为基础的(例如8月==7)同样,我认为今天实际上是8/24/15,而不是9/24/15。哇。。。。我只是没有正确地阅读计算器。我刚刚修改了我的答案,加入了一种直接计算所需日期的方法。禁止循环!这不是切换if语句和日期增量的顺序的功能等价物吗?如果要切换if语句和增量操作的顺序,那么在到达循环开头的测试之前,应该先增加日期。如果
计数
,则不能在测试前增加日期。您必须在
count==n
时立即中断循环。