# Printable Month Calendar Planner

> Works out how a month actually falls on a sheet of paper: how many week rows the grid needs, which column the 1st lands in, how large every day box comes out at that row count, and the ISO week number against each date. Month and weekday names come from your browser's own locale data, and every figure is computed in this tab.

Use it: https://tessalor.com/en/print/printable-calendar

This tool runs entirely in the browser. Nothing entered into it is uploaded.

## Formula

```
daysInMonth = 29 for February in a leap year, 28 otherwise
              30 for April, June, September, November
              31 for the rest

leap year   = year mod 4 = 0  and  (year mod 100 != 0  or  year mod 400 = 0)

firstColumn = 0 for a Sunday start, 1 for Monday, 6 for Saturday
              weekdays indexed Sunday = 0 … Saturday = 6

leadingBlanks  = (weekdayOfThe1st - firstColumn + 7) mod 7
cells          = leadingBlanks + daysInMonth
rows           = ceil(cells / 7)
trailingBlanks = rows x 7 - cells

for the dth day:
  offset = leadingBlanks + d - 1
  row    = floor(offset / 7) + 1
  column = (offset mod 7) + 1

ISO 8601 weeks run Monday to Sunday, and week 1 is the week holding the
year's first Thursday:

  isoWeekday = 1 for Monday … 7 for Sunday
  thursday   = dayNumber + (4 - isoWeekday)
  weekYear   = the calendar year that thursday falls in
  isoWeek    = floor((thursday - 1 January of weekYear) / 7) + 1

columns   = 8 when a week-number column is shown, otherwise 7
boxWidth  = (pageWidth  - 2 x margin) / columns
boxHeight = (pageHeight - 2 x margin - headingSpace) / rows

Every length is held as a whole number of micrometres up to that last
division. Every day number is integer arithmetic throughout.
```

## Assumptions

- Dates are computed in the proleptic Gregorian calendar for every year from 1583 onwards, which is why that is the earliest year offered. Britain and its colonies kept the Julian calendar until September 1752, so for a month before then this tool disagrees with the calendar people were actually using at the time — by ten days in 1583 and by eleven by 1752.
- The day the week starts on is chosen explicitly rather than inferred from the language. CLDR does record a first day per territory, but it is keyed on region and not on language, so "French" alone does not answer the question — and the setting changes the row count, which makes guessing it wrong more than a cosmetic error.
- ISO week numbers always count Monday-to-Sunday weeks, whatever day the grid starts on. A Sunday-start calendar therefore shows, against its first row, a week number for a week that began the day before that row does.
- Every column is the same width and every row the same height, including the week-number column when it is switched on. Printed calendars often narrow the week-number column or the weekend, and none of those conventions is standard enough to compute from.
- Paper sizes are trimmed sizes. Your printer's own hardware border, usually 4 to 6 mm and often wider at the trailing edge, is not deducted, so a margin below about 5 mm will be clipped by the printer rather than by anything here.
- Month and weekday names come from the locale data built into the browser reading this page. A cut-down build of that data, which a few embedded and self-compiled runtimes ship, falls back to English without saying so.

## Inputs

| Name | Label | Type | Default | Range |
| --- | --- | --- | --- | --- |
| `year` | Year | integer | 2026 | 1583 to 2400 |
| `month` | Month | select | 2 |  |
| `firstDay` | The week starts on | select | monday |  |
| `locale` | Language for the names | select | en-GB |  |
| `pageSize` | Paper | select | a4 |  |
| `orientation` | Orientation | select | landscape |  |
| `margin` | Margin | number | 12 | 0 to 50 |
| `headerHeight` | Space above the grid | number | 22 | 0 to 120 |
| `weekNumbers` | Add a week-number column | toggle | false |  |

## Outputs

- `weeks` — Rows on the sheet (integer), primary
- `days` — Days in the month (integer)
- `heading` — Heading on the sheet (monthYear)
- `firstWeekday` — The 1st falls on (text)
- `startColumn` — Column the 1st sits in (integer)
- `leadingBlanks` — Blank cells before the 1st (integer)
- `trailingBlanks` — Blank cells after the last (integer)
- `cellWidth` — Day box width (mm) (number)
- `cellHeight` — Day box height (mm) (number)
- `firstWeekNumber` — ISO week of the 1st (integer)
- `lastWeekNumber` — ISO week of the last day (integer)

## Questions

### Why does my calendar sometimes need six rows?

Because the grid has to hold the blank cells before the 1st as well as the days themselves, and once that total passes 35 it spills into a sixth row. Only a 31-day month starting in the sixth or seventh column, or a 30-day month starting in the seventh, can manage it. It happens two or three times in most years, and those sheets look visibly different from the rest because every box loses about a sixth of its height.

### Should the week start on Monday or Sunday?

It is a regional convention rather than a correct answer. Monday is the norm across most of Europe and is what ISO 8601 week numbering assumes; Sunday is the norm in the United States, Canada and Japan; Saturday is usual across much of the Middle East. What matters for printing is that the choice moves every date one column and can add or remove a whole row: February 2026 is five rows starting on Monday and four starting on Sunday.

### Why is the week number in early January 52 or 53?

Because ISO 8601 numbers weeks, not days, and a week belongs to whichever year holds its Thursday. 1 January 2027 is a Friday, so the week it sits in began on Monday 28 December 2026 and is therefore week 53 of 2026, not week 1 of 2027. The same rule runs the other way: 29 December 2025 is a Monday, so the last three days of 2025 are already week 1 of 2026.

### Is my calendar uploaded anywhere?

No. The arithmetic runs in this browser tab and there is no server to send it to. The month and weekday names come from locale data that is already part of your browser, so nothing is fetched to produce them either.

### Does this draw the calendar?

Not yet. It gives you the full layout — the row count, the box sizes to the hundredth of a millimetre, and a table of every date with the row, column and ISO week it belongs to, which downloads as CSV. That is enough to build the sheet in a drawing program, a spreadsheet or a stylesheet, but it is not a finished page you can send straight to a printer.

### Why does the printed sheet measure smaller than the figures here?

Almost always because it was scaled. Print dialogues default to fitting the page to the printable area, which shrinks everything by two or three per cent. Set the scale to 100%, or "Actual size", and turn off "fit to page". Laying a ruler across all seven columns is the quickest check: on A4 landscape with a 12 mm margin they should measure 273 mm in total.

## Sources

- [Unicode Technical Standard #35: Unicode Locale Data Markup Language (LDML) Part 4: Dates](https://www.unicode.org/reports/tr35/tr35-dates.html) — Unicode Consortium, applies to version 48.2 — week data, and month and weekday name data. Retrieved 2026-07-30.
- [ECMAScript Internationalization API Specification (ECMA-402)](https://tc39.es/ecma402/) — Ecma International, applies to Intl.DateTimeFormat, draft of 29 July 2026. Retrieved 2026-07-30.
- [Introduction to Calendars](https://aa.usno.navy.mil/faq/calendars) — Astronomical Applications Department, United States Naval Observatory, applies to the Gregorian leap-year rule and the 1582 introduction. Retrieved 2026-07-30.
- [CSS Paged Media Module Level 3](https://www.w3.org/TR/css-page-3/) — W3C, applies to Working Draft, 14 September 2023 — named page sizes. Retrieved 2026-07-30.

## Variants

- [Does starting the week on Sunday change the calendar layout?](https://tessalor.com/en/print/printable-calendar/week-starting-sunday)
- [Why does a printed month calendar sometimes need six rows?](https://tessalor.com/en/print/printable-calendar/six-row-months)

---

Estimate, not advice. See https://tessalor.com/en/disclaimer.
Machine-readable catalogue: https://tessalor.com/api/tools.json
