Working Days, Not Calendar Days
A fourteen-calendar-day gap contains ten working days. A fourteen-*working*-day gap spans almost three calendar weeks. Contracts, SLAs and statutory deadlines are written in one or the other, and confusing them is how deadlines get missed.
| Calendar days | Working days (typical) |
|---|---|
| 7 | 5 |
| 14 | 10 |
| 30 | ~22 |
| 90 | ~65 |
| 365 | ~261 |
The Counting Convention
The first question in any deadline dispute is whether the start date counts. Most legal and contractual conventions exclude the day the clock starts and include the day it ends: "within 5 business days" from a Monday means the following Monday, not Friday.
Where a deadline lands on a non-working day, the usual rule is to move to the next working day — but that is a convention, not a law, and some contracts move backwards instead. Read the definition rather than assuming.
Holidays Are Local and Unknowable
No date calculator can know your holidays. Public holidays differ by country, by region within a country, and by industry; company-specific closures differ again. England and Wales, Scotland and Northern Ireland have different bank holiday sets; US federal holidays are not the same as state holidays; many countries have moveable religious holidays.
Subtract your own holiday calendar from any figure a calculator gives you.
Where the Difference Compounds
- Payment terms. "Net 30 days" and "30 business days" are six weeks apart.
- Notice periods. A 5-business-day notice given on Friday afternoon effectively starts
- SLAs. "Response within 4 business hours" on a Friday at 4pm means Monday at midday.
- Shipping. Carriers count business days, and a Friday dispatch does not move over a
The Arithmetic
Between two dates, the whole weeks contribute exactly five working days each. Only the partial week at each end needs care, which is where hand-counting goes wrong — particularly when the range starts or ends on a weekend.
The Traps in Date Arithmetic
Months are not 30 days. Adding one month to 31 January has no correct answer, and every library picks differently — 28 February, 2 March or an error. Decide which your business needs before the edge case decides for you.
Days are not always 86,400 seconds. Daylight saving makes one day 23 hours and another
25. Adding n * 86400000 milliseconds drifts by an hour twice a year, which is enough to
move a date across midnight and return an answer one day out.
``javascript
// Correct — the Date object normalises overflow and handles DST
const addDays = (date, days) => {
const result = new Date(date);
result.setDate(result.getDate() + days);
return result;
};
// Correct — calendar days, unaffected by DST or time of day
const daysBetween = (a, b) => {
const utc = (d) => Date.UTC(d.getFullYear(), d.getMonth(), d.getDate());
return Math.round((utc(b) - utc(a)) / 86400000);
};
`
Months are zero-indexed in JavaScript. new Date(2026, 0, 1) is January. new
Date(2026, 12, 1) is January 2027, silently.
Parsing is not portable. new Date("2026-08-30") is parsed as UTC, while
new Date("2026/08/30")` is parsed as local — the same calendar date, a day apart in some
zones. Always parse ISO 8601, and construct with explicit components when the time matters.
Time Zones Decide the Answer
| Question | Depends on |
|---|---|
| How many days until an event? | The viewer's zone |
| Is this subscription expired? | UTC, always |
| What day of the week was this? | The zone the event happened in |
| When does "tomorrow" start? | The viewer's zone |
Reference Points
| Interval | Days |
|---|---|
| Week | 7 |
| Month (average Gregorian) | 30.44 |
| Quarter | 91.31 |
| Year | 365.2425 |
| Leap year | 366 |