Month Calendar Grid Builder for UIs
Build a flat seven-column calendar grid for any month, honoring a configurable first weekday and blank padding cells.
Code
export function buildMonthGrid(year, month, options = {}) {
if (!Number.isInteger(year) || year < 1 || year > 9999) {
throw new RangeError("year must be an integer between 1 and 9999");
}
if (!Number.isInteger(month) || month < 1 || month > 12) {
throw new RangeError("month must be an integer between 1 and 12");
}
const weekStartsOn = options.weekStartsOn ?? 0;
if (!Number.isInteger(weekStartsOn) || weekStartsOn < 0 || weekStartsOn > 6) {
throw new RangeError("weekStartsOn must be an integer between 0 and 6");
}
const first = new Date(Date.UTC(year, month - 1, 1));
const daysInMonth = new Date(Date.UTC(year, month, 0)).getUTCDate();
const offset = (first.getUTCDay() - weekStartsOn + 7) % 7;
const totalCells = Math.ceil((offset + daysInMonth) / 7) * 7;
const cells = [];
for (let index = 0; index < totalCells; index += 1) {
const day = index - offset + 1;
cells.push(day >= 1 && day <= daysInMonth ? day : null);
}
return { year, month, weekStartsOn, cells };
}Report a problem with this exampleOpens a pre-filled issue on GitHub.