javascript 37 lines · 9 steps

Building a text calendar in JavaScript

Turn a year and month into a grid of weeks, then render it as an aligned ASCII calendar.

Explained by highlit
1function generateCalendarGrid(year, month) {
2 const firstDay = new Date(year, month, 1);
3 const lastDay = new Date(year, month + 1, 0);
4 const daysInMonth = lastDay.getDate();
5 const startWeekday = firstDay.getDay();
6 
7 const weeks = [];
8 let week = new Array(7).fill(null);
9 
10 for (let day = 1; day <= daysInMonth; day++) {
11 const weekday = (startWeekday + day - 1) % 7;
12 week[weekday] = day;
13 if (weekday === 6 || day === daysInMonth) {
14 weeks.push(week);
15 week = new Array(7).fill(null);
16 }
17 }
18 
19 return weeks;
20}
21 
22function renderCalendar(year, month) {
23 const monthName = new Date(year, month).toLocaleString('default', { month: 'long' });
24 const headers = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];
25 const weeks = generateCalendarGrid(year, month);
26 
27 const cell = (v) => (v === null ? ' ' : String(v).padStart(2, ' '));
28 const lines = [];
29 
30 lines.push(`${monthName} ${year}`.padStart(11 + Math.floor((monthName.length + 5) / 2)));
31 lines.push(headers.join(' '));
32 for (const week of weeks) {
33 lines.push(week.map(cell).join(' '));
34 }
35 
36 return lines.join('\n');
37}
01 / 01
STEP 01

Walkthrough

Space play ←→ step click any line
Three takeaways
  1. 1Passing day 0 of the next month is a clean trick to get the last day of the current one.
  2. 2Modular arithmetic maps a running day count onto fixed weekday columns without branching.
  3. 3Separating grid generation from rendering keeps the date logic reusable and the output swappable.

Related explainers

Share this explainer

Here's the card — post it anywhere.

Building a text calendar in JavaScript — share card
Made with highlit — turn any snippet into a walkthrough like this in about a minute.
Explain your code