The Date Is Set By Rules, Not By Choice
"Retirement age" is at least three different numbers, and they rarely coincide:
| Age type | What it governs |
|---|---|
| State pension age | When the government pension starts |
| Private pension access age | When you may draw your own pension |
| Full retirement age | When an unreduced benefit is payable |
| Your chosen date | When you actually stop working |
Claiming Early or Late Changes the Amount Permanently
The adjustment is not a one-off. In the US system, claiming at 62 rather than 67 reduces the monthly benefit by around 30% for life; delaying to 70 increases it by roughly 8% a year.
| Claim age | Approximate benefit |
|---|---|
| 62 | 70% of full |
| 65 | 87% |
| 67 | 100% |
| 70 | 124% |
The Gap Years Are the Planning Problem
If you stop working at 60 and the pension starts at 67, seven years must come from savings. That gap is the hardest part of any retirement plan, and it is the part a countdown to a single date obscures.
Counting Down
Knowing the exact number of days remaining is genuinely useful for the concrete decisions: when to move a portfolio toward lower volatility, when a final catch-up contribution must be made, when notice must be given, and when healthcare coverage changes.
*This is a date calculator, not financial advice. Pension rules are jurisdiction-specific and change; check your own statement and speak to a regulated adviser.*
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 |