Add Days to Date Calculator
Calculate future dates by adding days to any starting date. Perfect for deadline planning, delivery estimates, and scheduling.
Common Date Calculations
| Starting Date | Add Days | Result |
|---|---|---|
| Today | +30 | One month ahead |
| Today | +90 | Three months ahead |
| Today | +365 | One year ahead |
| Today | +7 | One week ahead |
Date Addition Implementation
``javascript
function addDays(date, days) {
const result = new Date(date);
result.setDate(result.getDate() + days);
return result;
}
`
Business Days vs Calendar Days
Business day calculations exclude weekends and holidays. A 30-day deadline in business days is actually about 42 calendar days (30 × 7/5).
Adding Days Is Not Simple Arithmetic
Adding days to a date looks like addition and is not, because the calendar is not
uniform. Three things break naive implementations:
| Trap | What happens |
|---|---|
| Month lengths | 31 January + 1 month is 31 February, which does not exist |
| Leap years | Every 4 years, except centuries, except every 400th |
| Daylight saving | One day a year is 23 hours and another is 25 |
The safe pattern in JavaScript is to mutate the date rather than add milliseconds:`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;
};
// Wrong — assumes every day is exactly 86,400,000 ms
const broken = new Date(date.getTime() + days * 86400000);
`
The second version drifts by an hour twice a year in any zone that observes DST, which is
enough to move a date across midnight and give an answer one day out.
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 |