Skip to main content

monthCalendar

// O(1) time because a month calendar has at most 6 weeks * 7 days
// O(1) space

/**
* Given a Date, return an array of arrays representing
* a calendar view for that month.
*
* Each week starts on Sunday.
*
* @param {Date} date
* @return {number[][]}
*/
export default function monthCalendar(date) {
const year = date.getFullYear();
const month = date.getMonth();

const firstDayOfMonth = new Date(year, month, 1);
const startDay = firstDayOfMonth.getDay(); // 0 = Sunday

// Start from the Sunday before/on the 1st of the month
const calendarStart = new Date(year, month, 1 - startDay);

const calendar = [];

for (let week = 0; week < 6; week++) {
const currentWeek = [];

for (let day = 0; day < 7; day++) {
currentWeek.push(calendarStart.getDate());
calendarStart.setDate(calendarStart.getDate() + 1);
}

calendar.push(currentWeek);
}

return calendar;
}

/**
* console.log(monthCalendar(new Date(2026, 4))); // May 2026
* Output: [[29, 30, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26], [27, 28, 29, 30, 31]]
*/