Calculate exact age
Someone born on 17 May 1990 is 36 years, 2 months and 8 days old on 25 July 2026, counted with real month lengths and leap years. Pick any reference date for forms, records or eligibility checks. 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-17
- Reference date
- 2026-07-25
- Years
- 36
- Months
- 2
- Days
- 8
The exact age calculator turns a birth date and a chosen reference date into a clear calendar age expressed in completed years, completed months, and remaining days. Unlike a simple day count divided by 365, it respects real Gregorian month lengths and leap years. Use today’s date when you want a current age, or enter any historical or future reference date for records, eligibility checks, anniversaries, forms, and reproducible calculations.
Enter two complete calendar dates
Start with the birth date, then provide the date on which the age should be measured. Both values must use the unambiguous YYYY-MM-DD format, so 17 May 1990 is written as 1990-05-17. The reference date does not have to be today.
That makes the calculator useful when you need to know someone’s age on the date of an application, appointment, event, transaction, or archived record. The tool validates every component rather than accepting a date merely because it resembles the expected pattern. It rejects impossible values such as 2025-02-29, months outside 01 through 12, missing zero padding, and non-date text.
It also rejects a reference date earlier than the birth date, because that ordering cannot describe a nonnegative age. No current date is inserted automatically, so the same two inputs always produce the same answer.
Understand how years, months, and days are counted
The result is a calendar duration, not an estimate made by dividing elapsed days by an average year. First, the calculator finds the greatest number of complete years that can be added to the birth date without passing the reference date. It then finds the greatest number of complete months that fit after that yearly anniversary.
The remaining interval is reported as days. Month-end dates are clamped to the final valid day when the corresponding month is shorter. For example, an anchor that begins on the thirty-first becomes the last day of a month that has only thirty days.
A birth date of February 29 similarly reaches February 28 in a non-leap anniversary year. This convention keeps each component nonnegative and gives a stable, practical civil age. Gregorian leap-year rules are applied in full: years divisible by four are leap years, century years are not, and years divisible by four hundred are.
The returned years, months, and days therefore reflect the actual calendar around the supplied dates.
Use the result consistently and responsibly
Exact calendar age is useful wherever a plain whole-year answer loses important detail. Schools and clubs can measure age on a fixed enrollment cutoff. Administrators can calculate the age recorded on an incident or service date instead of accidentally using the present day.
Families can prepare milestone summaries, while developers can produce consistent values for forms, reports, CRM records, and eligibility previews. The response repeats both normalized input strings alongside the three age components, making it easy to see which dates produced the result. Regulations may define age, leap-day anniversaries, deadlines, or inclusive counting differently in a particular jurisdiction or program.
When the result controls access to a regulated service, benefit, contract, or legal status, confirm the governing rule and its cutoff time. Store the supplied reference date with the result so future reviewers can reproduce the calculation precisely.
What you can do with it
Check age on an application date
Measure completed years, months, and days on the fixed date when an application or enrollment was submitted.
Prepare a dated record
Calculate the age associated with an appointment, incident, assessment, or historical entry instead of using today.
FAQ
Does the reference date have to be today?
No. Enter any valid date on or after the birth date, including a historical cutoff or a planned future date.
How are February 29 birthdays handled?
For a non-leap anniversary year, the yearly anchor is clamped to February 28 before complete months and remaining days are counted.
Why not divide the number of days by 365?
Years and months have different lengths. Calendar anchoring produces meaningful completed years, months, and days without relying on averages.
How old is someone born on 17 May 1990 on 25 July 2026?
They are 36 years, 2 months and 8 days old. The calculator first counts complete years, then complete months after the last birthday, and reports what is left as days.
What happens with birthdays at the end of a month?
When a later month is shorter, the anniversary moves to its last valid day: a date that starts on the last day of a long month lands on the last day of a shorter one. Every part of the age stays zero or positive.
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/calc2/age-calculate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"birth_date":"1990-05-17","reference_date":"2026-07-25"}'const res = await fetch("https://api.kit.forhosting.com/calc2/age-calculate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"birth_date": "1990-05-17",
"reference_date": "2026-07-25"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/calc2/age-calculate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"birth_date": "1990-05-17",
"reference_date": "2026-07-25"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/calc2/age-calculate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"birth_date":"1990-05-17","reference_date":"2026-07-25"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"birth_date":"1990-05-17","reference_date":"2026-07-25"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/calc2/age-calculate", 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-17",
"reference_date": "2026-07-25"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "calc2.age_calculate",
"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.
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
Use the result consistently and responsibly
For automated work, one request costs $0.002; the browser version can perform the same deterministic calculation locally. This tool provides arithmetic, not a legal ruling.
Integration use cases
Build reproducible workflows
Use explicit dates in forms, reports, and API automations so the result stays stable whenever it is recalculated.
Technical questions
What does one API calculation cost?
One API request costs $0.002. The same deterministic calculation is also available in the browser.
What happens if the reference date is before the birth date?
The request fails with an invalid_input error because an age cannot be calculated in that direction.