Obtenga un día de la semana determinado en un mes determinado con JavaScript

Estoy tratando de get el n ° día laborable, por ejemplo, el segundo domingo, de un mes en el que caiga determinada date.

Por ejemplo, si la date es el 24 de agosto de 2015, me gustaría hacer esto:

nthDayOfMonth(0, 2, new Date(2015, 7, 24)) 

y obtenga el 9 de agosto de 2015 (segundo domingo de agosto). Entonces me gustaría poder agregar un mes a la date, llamar de nuevo a la function y get el 13 de septiembre de 2015 (segundo domingo de septiembre).

Por alguna razón, el siguiente código no funciona.

¿Qué me estoy perdiendo?

 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; 

}

    3 Solutions collect form web for “Obtenga un día de la semana determinado en un mes determinado con JavaScript”

    Debes verificar idate.getDay() antes de incrementar el día del mes. De lo contrario, recibirá una respuesta incorrecta si el día de la semana deseado cae el primero del mes.

    El siguiente fragment muestra la function corregida.

     function print(s) { document.write(s + '<br />'); } function nthWeekdayOfMonth(weekday, n, date) { var count = 0, idate = new Date(date.getFullYear(), date.getMonth(), 1); while (true) { if (idate.getDay() === weekday) { if (++count == n) { break; } } idate.setDate(idate.getDate() + 1); } return idate; } // Second Sunday of the current month. var date = new Date(); print(date = nthWeekdayOfMonth(0, 2, date)); // Second Sunday of next month. date.setMonth(date.getMonth() + 1); print(date = nthWeekdayOfMonth(0, 2, date)); // First Tuesday of September 2015. print(nthWeekdayOfMonth(2, 1, new Date(2015, 8))); // First Wednesday of September 2015. print(nthWeekdayOfMonth(3, 1, new Date(2015, 8))); // Second Tuesday of September 2015. print(nthWeekdayOfMonth(2, 2, new Date(2015, 8))); // Second Wednesday of September 2015. print(nthWeekdayOfMonth(3, 2, new Date(2015, 8))); 
     body { font-family: sans-serif; } 

    Tu código parece funcionar bien. Para agregar un mes, puede usar d.setMonth(d.getMonth()+1) .

    Prueba esta demo:

     function nthDayOfMonth(day, n, date) { var count = 0, idate = new Date(date); idate.setDate(1); while (count < n) { idate.setDate(idate.getDate() + 1); if (idate.getDay() == day) { count++; } } return idate; } // Today : 2015-08-24 var today = new Date(); // Second Sunday of current month : 2015-08-09 var res = nthDayOfMonth(0, 2, today); // res plus 1 month : 2015-09-09 (Wednesday) var plusOne = new Date( res ); plusOne.setMonth(plusOne.getMonth() + 1); // Second Sunday of next month : 2015-09-13 var res2 = nthDayOfMonth(0, 2, plusOne); document.body.innerHTML = 'Today is <br>' + today + '<br>' + 'Second Sunday of current month is <br>' + res + '<br>' + 'If you add a month to it, you get <br>' + plusOne + '<br>' + 'And second Sunday of that month is <br>' + res2; 

    Acabo de agregar un ajuste a la excelente respuesta de Michael Laszlo para permitir que la persona que llama proporcione n == 5 (o cualquier valor mayor) para indicar que se desea el último día de la semana del mes:

     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; } 
    Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.