javascriptmomentjs

Get the 2nd Friday of a month with MomentJS


I am trying to get the nth Friday of a month with momentjs

where n is in the range [1,4]

So if a user supplies n as 2. Then I need to get the date for the second Friday of the month.

Here is what I tried with no sucess

let startingFrom = new Date("StartDateStringGoesHere");
let n=2;
let nthFriday = moment(startDate).isoWeekday(n); //I can't figure out how to resolve it here

Any ideas will be truly appreciated.


Solution

  • Here's a generic function, no library needed

    Edit: added logic to get last occurence (simply use 5)

    function nthWeekdayOfMonth(year, month, nth, dow) {
        const d = new Date(year, month - 1, 7 * (nth - 1) + 1);
        const w = d.getDay();
        d.setDate(d.getDate() + (7 + dow - w) % 7);
        // 5th occurance means last, so here is logic for last dow of month
        if (d.getMonth() + 1 > month || d.getFullYear() > year) {
          d.setDate(d.getDate() - 7);
        }
        return d;
    }
    
    // second(2) friday(5)
    for (let month = 1; month < 13; month++) {
        console.log(nthWeekdayOfMonth(2022, month, 2, 5).toString());
    }
    
    // third(3) sunday(0)
    for (let month = 1; month < 13; month++) {
        console.log(nthWeekdayOfMonth(2022, month, 3, 0).toString());
    }
    // last(5) Sunday(0)
    for (let month = 1; month < 13; month++) {
        console.log(nthWeekdayOfMonth(2022, month, 5, 6).toString());
    }