Twelve months on one page, with today marked, US federal holidays listed, and the day and business-day math worked out for whichever year you pick.
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
|---|
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
|---|
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
|---|
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
|---|
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
|---|
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
|---|
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
|---|
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
|---|
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
|---|
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
|---|
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
|---|
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
|---|
Northern Hemisphere seasons (calendar approximation, not exact solstice or equinox timing): spring starts March 20, summer June 21, autumn September 22, winter December 21.
| Date | Day | Holiday |
|---|
Two numbers decide every month's shape: how many days it holds, and which weekday day one lands on. Get either wrong and the grid drifts.
This page leaves both to the browser's own date math rather than a lookup table. new Date(year, month + 1, 0).getDate() returns the last day of a month, which doubles as its length. new Date(year, month, 1).getDay() returns the weekday the first falls on, in the zero-to-six range Sunday through Saturday. Everything else, the empty lead-in cells, the weekend shading, the today marker, follows from those two calls.
Leap years are the one place this gets interesting. The Gregorian rule is three tests deep: a year divisible by 4 is a leap year, unless it is also divisible by 100, in which case it is not, unless it is also divisible by 400, in which case it is after all.
| Condition | Result | Example |
|---|---|---|
| Divisible by 4 | Leap year | 2024 |
| Divisible by 4 and 100 | Not a leap year | 1900 |
| Divisible by 4, 100, and 400 | Leap year | 2000 |
2100 will not be a leap year under this rule, which surprises people who only remember the "every four years" version.
Four of the ten US federal holidays sit on a fixed date every year: New Year's Day, Independence Day, Veterans Day, and Christmas. The other six move, because they are defined relative to a weekday rather than a day number.
The table above recalculates each of those weekday rules for whatever year is selected, rather than storing a fixed list of dates. That is why switching years also reshuffles which dates show up next to each holiday name.
Where this calendar stops short: the holiday list is the US federal schedule specifically. It says nothing about UK bank holidays, Canadian statutory holidays, or any other country's calendar, and it does not know about your employer's floating days off or regional closures.
The year dropdown only runs ten years back and ten forward from today, because that range comes from the server request rather than a stored table. Need 1850 or 2400? A general-purpose date library will get you there faster than this page will.
There is also no export, no saved events, and no reminders here. Treat it as a reference grid. For anything that involves acting on a date rather than looking one up, the business days calculator or the countdown timer linked below will do more of the work.
Specifics about the year range, the holiday rules, and what this grid does not track.
The list is built from the year on the request, minus ten and plus ten. It is not a fixed table, so the range always centers on whatever "today" is when the page loads, not a hardcoded start and end year.
No. Four holidays use a fixed month and day. The other six are computed from weekday rules, such as third Monday of January, using plain date arithmetic in the browser. Nothing is fetched over the network for this.
No. The grid is Gregorian only, and the holiday list is the US federal schedule. Islamic, Hebrew, Chinese, and other calendar systems are not represented here.
The count excludes Saturdays, Sundays, and the ten US federal holidays shown above. It has no idea about company-specific closures, regional public holidays, or shortened weeks, so treat it as a baseline, not a final answer for payroll or scheduling.
Yes. The grid is a plain HTML table, so a browser print dialog (Ctrl+P or Cmd+P) renders it cleanly on standard paper without extra setup.