Age Calculator
Calculate your exact age in years, months, weeks, and days from your birth date. Also shows upcoming birthday countdown.
Age Information
| Metric | Calculation |
|---|---|
| Years | Complete years since birth |
| Months | Remaining months after years |
| Days | Remaining days after months |
| Total days | Complete days alive |
| Next birthday | Days until next birthday |
Age in Different Units
For someone born exactly 30 years ago:
- 30 years
- 360 months
- 1,565 weeks
- 10,957 days
- ~262,968 hours
- ~15,778,080 minutes
Implementation
``javascript
function calculateAge(birthDate) {
const today = new Date();
const birth = new Date(birthDate);
let years = today.getFullYear() - birth.getFullYear();
const monthDiff = today.getMonth() - birth.getMonth();
if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birth.getDate())) {
years--;
}
return years;
}
`
Measuring the Gap Between Two Dates
Two dates can be "one day apart" in several different senses, and the one you want
depends on the question:
| Measure | 2026-03-01 to 2026-03-02 |
|---|---|
| Calendar days between | 1 |
| Days inclusive of both ends | 2 |
| 24-hour periods elapsed | 1, or 0.958 across a spring DST change |
| Business days | 1, unless one is a weekend |
The inclusive/exclusive distinction is where most off-by-one bugs live. "How many days is
the conference" (inclusive) and "how many days until the conference" (exclusive) differ by
one, and both phrasings appear in the same requirements document.`javascript
// Calendar days, DST-safe: compare at UTC midnight
const daysBetween = (a, b) => {
const utc = (d) => Date.UTC(d.getFullYear(), d.getMonth(), d.getDate());
return Math.round((utc(b) - utc(a)) / 86400000);
};
`
Normalising to UTC midnight before subtracting removes both the DST problem and any
time-of-day component, which is almost always what "days between" is meant to mean.
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 |