Skip to content
OfficeOpenToday

Methodology

How the dates on this site are produced, checked, and prevented from going stale.

Dates are calculated, not stored

Every holiday is defined by a rule, and the rule is what this site stores. Thanksgiving is "the fourth Thursday in November"; Independence Day is "4 July"; Memorial Day is "the last Monday in May". The date for any given year is computed from that rule when the site is built.

The alternative — a table of dates typed in year by year — is what most calendar sites do, and it fails in a specific way: one mistyped row is invisible until someone misses a deadline because of it. A rule cannot be wrong for 2031 but right for 2030.

Chinese New Year is the exception: there is no Gregorian weekday rule, so those dates are a sourced lookup covering the published window plus the observances table. Years outside that table are not guessed.

The published window is 2024 to 2031, and it moves forward on its own as the site rebuilds.

Observed dates

A holiday fixed to a calendar date can land on a weekend. In the United States, one falling on a Saturday is observed on the preceding Friday, and one falling on a Sunday on the following Monday. 5 of the 11 federal holidays are fixed to a date and can therefore shift; the rest are tied to a weekday and never move.

Where the observed date differs from the actual date, both are shown, and it is the observed date — the day the office is actually closed — that is marked on calendars and counted in working-day totals.

All arithmetic is UTC

Every date calculation runs in UTC. A build on a machine in Los Angeles and a build on a machine in Berlin produce byte-identical dates. Local-timezone date math is a classic source of off-by-one errors — a date constructed at midnight local time can land on the previous day once converted — and using UTC throughout removes that failure mode rather than trying to catch it later.

The date engine is covered by an automated test suite that runs on every build, including the awkward cases: leap years, century leap rules, month-end boundaries and the weekend-shift rules.

Sourcing, and how staleness is prevented

Each holiday carries its legal basis and one or more sources, each with the date it was last verified. Those dates are printed on the page rather than kept internally, so the claim is checkable rather than asserted.

The build enforces it. An entry with no source fails the build. So does an entry whose most recent verification is more than twelve months old. The site cannot deploy with data that has quietly aged out — the deploy stops instead.

What is not computed as a holiday fact

Moon phases on /lunar-calendar/{year}/ are an astronomical approximation: synodic age from a known new moon (Meeus). They are labelled as an estimate on those pages and are not sourced holiday facts.

Novelty observances are not published. Sites in this category commonly list several hundred per month; almost none carry an authority that can be cited. A holiday date is published here with a source or not at all.

Civic dates such as Mother’s Day use the same page template as federal holidays and are labelled “Not A Public Holiday.” Working-day counts and the .ics feed still use only the eleven observed federal holidays.

Corrections

When a legislature adds, renames or moves a holiday, the change is made once in the rule and every affected year corrects itself on the next build. There is no year-by-year table to sweep, so a correction cannot be applied to some years and missed in others.

Every source behind the current data, with its verification date, is listed on the sources page.