Age in years, months and days
Get a person's exact age as years, months and days: someone born on 1990-05-15 is 34 years, 3 months and 5 days old on 2024-08-20. Leap years and short months are handled for school, visa or clinic forms. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Birth date
- 1990-05-15
- Reference date
- 2024-08-20
- Years
- 34
- Months
- 3
- Days
- 5
- Total days
- 12,516
People search for an age in years, months, and days calculator when a single birthday year is not enough: a school form, a visa, a pediatric note, or a payroll record wants the civil breakdown of how long someone has lived from an explicit birth date to an explicit reference day. This page accepts two strict ISO calendar dates, validates that each day exists on the Gregorian calendar including leap Februaries, and returns completed years, leftover months, and leftover days. The birth date must fall on or before the reference date so civil age never runs backwards; a later birth is invalid input rather than a negative age.
How civil age in years, months and days is computed
Begin with two civil calendar dates written as year, month, and day in the international ISO form with hyphens and fixed widths so every client agrees on the same six integers: the birth date and the reference date you care about, such as today on a form, a report cut-off, a visa interview, or a historical milestone.
For each string confirm that the year lies in a practical Gregorian range from year one through nine thousand nine hundred ninety-nine, that the month is between one and twelve, and that the day exists for that month under Gregorian leap rules: a year is a leap year when it is divisible by four, except that century years are leap years only when they are also divisible by four hundred.
That rule makes February twenty-nine legal in years such as two thousand twenty-four and two thousand, and illegal in two thousand twenty-three and nineteen hundred. When both triples are valid and the birth date is not later than the reference, count the provisional calendar months between them, add that many months to the birth date while clamping the day to the last day of the destination month, and walk the count back if the clamped date overshoots the reference.
Leftover days are the Julian Day Number remainder from that last complete month-add to the reference day. Completed years are the month count divided by twelve with integer floor; leftover months are the remainder modulo twelve.
Where years-months-days age calculators show up in real work
School and university offices print civil age in years, months, and days on enrollment forms, scholarship packets, and age-banded exam eligibility when a whole-year figure hides a child who is still eleven months short of the cutoff. Immigration, visa, and civil-registry desks ask the same breakdown so an officer can see leftover months without doing calendar arithmetic by hand.
Pediatric and family clinics write age as years plus months plus days on growth notes and vaccine records, especially in the first few years of life when a year-only label is too coarse. Human-resources and benefits tooling expresses continuous service or dependent age in the same three-part form for plan eligibility.
If you later need total weeks lived, hours from a year count with no calendar dates, a signed difference that allows either order, or business-day counts that skip weekends, treat those as separate search intents and landings rather than overloading this age-in-years-months-and-days page.
What you can do with it
School, visa, and civil-registry forms
Turn a birth ISO date and a filing or interview day into years, months, and leftover days for enrollment, visa, and registry paperwork.
Pediatric and family clinic notes
Write a child’s age as completed years plus leftover months and days for growth charts, vaccine records, and visit summaries.
HR, benefits, and age-banded eligibility
Compute dependent or employee civil age to a plan cut-off so leftover months are visible instead of a rounded year.
FAQ
What does age in years, months and days mean?
It is civil calendar age from an explicit birth date to an explicit reference date: completed years, leftover months from zero through eleven, and leftover days after those months, without using wall-clock “today” or business-day rules.
What date format is required?
Values like 1990-5-15 or 1990/05/15 are rejected so every client agrees.
What if the birth date is after the reference date?
Civil age cannot be negative; swap the fields only if you meant a signed date-difference tool rather than age.
What does it cost?
The browser tool is free and runs locally.
How are month-end dates such as the last day of January handled?
When a month is added, the day is moved to the last day of the target month if needed, then corrected so it never passes the reference date. From the last day of January to March 1, the result is 1 month and 1 day.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/life/age-in-years-months-and-days \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"birth_date":"1990-05-15","reference_date":"2024-08-20"}'const res = await fetch("https://api.kit.forhosting.com/life/age-in-years-months-and-days", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"birth_date": "1990-05-15",
"reference_date": "2024-08-20"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/life/age-in-years-months-and-days",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"birth_date": "1990-05-15",
"reference_date": "2024-08-20"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/life/age-in-years-months-and-days", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"birth_date":"1990-05-15","reference_date":"2024-08-20"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"birth_date":"1990-05-15","reference_date":"2024-08-20"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/life/age-in-years-months-and-days", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"birth_date": "1990-05-15",
"reference_date": "2024-08-20"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "life.age_in_years_months_and_days",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
year_min | 1 |
year_max | 9999 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Successful API requests cost $0.002; failed validation is not charged.
What you send and what you get back
Classic checks include an exact birthday anniversary yielding whole years with zero leftover months and days, a mid-year reference such as the fifteenth of May to the twentieth of August adding three months and five days, January thirty-first to March first landing as one month and one day after the February clamp, and identical dates yielding zero years, zero months, and zero days. Send two required string fields: birth_date and reference_date, each a strict ISO calendar day such as nineteen ninety hyphen zero five hyphen one five and two thousand twenty-four hyphen zero eight hyphen two zero. Common aliases such as dob, birth, birthdate, as_of, and to are accepted by the same core so scripts can use familiar names without changing the math. Missing fields, non-string values, strings that do not match the four-two-two digit pattern, dates that match the pattern but are not real calendar days, and a birth date that falls after the reference all fail with invalid_input and are not charged. On success the response echoes the normalized birth_date and reference_date ISO strings, years as completed civil years, months as leftover months from zero through eleven, days as leftover civil days after those months, total_days as the non-negative day span from the two Julian Day Numbers, and a short formula string that documents the clamp-and-overshoot path. Pricing for successful API calls is the published base of $0.002 per item; validation failures do not consume prepaid balance.
Where years-months-days age calculators show up in real work
Because this capability is a pure parse engine, the work runs entirely in your browser on this page, and through the API each successful lookup costs $0.002 while failed validation does not consume balance.
Technical questions
Why do I need a reference date instead of using today?
Both dates are explicit so the result is fully deterministic: the same pair always yields the same years, months, and days in golden tests, offline widgets, and workers that must not read the host clock.