DATE
Age Calculator
Find your exact age in years, months, and days — with next birthday countdown and life stats.
Developer Reference
Core Algorithm & Standalone Script
Standalone, zero-dependency JavaScript implementation powering this tool. Free to inspect, copy, and build upon.
const DAYS_OF_WEEK = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
const MONTHS = ['January','February','March','April','May','June','July','August','September','October','November','December'];
// Set max date for dob to today
const todayStr = new Date().toISOString().split('T')[0];
document.getElementById('dob').setAttribute('max', todayStr);
document.getElementById('as-of').setAttribute('max', todayStr);
function fmt(n) { return Math.round(n).toLocaleString(); }
function calcAge(dob, asOf) {
let years = asOf.getFullYear() - dob.getFullYear();
let months = asOf.getMonth() - dob.getMonth();
let days = asOf.getDate() - dob.getDate();
if (days < 0) {
months--;
const prevMonth = new Date(asOf.getFullYear(), asOf.getMonth(), 0);
days += prevMonth.getDate();
}
if (months < 0) {
years--;
months += 12;
}
return { years, months, days };
}
function daysUntilNextBirthday(dob, asOf) {
const thisYear = asOf.getFullYear();
let next = new Date(thisYear, dob.getMonth(), dob.getDate());
if (next <= asOf) {
next = new Date(thisYear + 1, dob.getMonth(), dob.getDate());
}
const diff = Math.round((next - asOf) / (1000 * 60 * 60 * 24));
return { days: diff, nextAge: thisYear + (next.getFullYear() === thisYear + 1 ? 1 : 0) - dob.getFullYear() };
}
function isBirthday(dob, asOf) {
return dob.getMonth() === asOf.getMonth() && dob.getDate() === asOf.getDate();
}
document.getElementById('calc-btn').addEventListener('click', calculate);
document.getElementById('dob').addEventListener('keydown', e => { if (e.key === 'Enter') calculate(); });
function calculate() {
const dobVal = document.getElementById('dob').value;
if (!dobVal) return;
const dob = new Date(dobVal + 'T00:00:00');
const asOfVal = document.getElementById('as-of').value;
const asOf = asOfVal ? new Date(asOfVal + 'T00:00:00') : new Date(todayStr + 'T00:00:00');
if (dob > asOf) return;
const { years, months, days } = calcAge(dob, asOf);
const totalDays = Math.floor((asOf - dob) / (1000 * 60 * 60 * 24));
const totalWeeks = Math.floor(totalDays / 7);
const totalMonths = years * 12 + months;
const totalHours = totalDays * 24;
const { days: nextBdayDays, nextAge } = daysUntilNextBirthday(dob, asOf);
const isToday = isBirthday(dob, asOf);
const heartbeats = totalDays * 86400 * 1.2;
const breaths = totalDays * 86400 * 0.267;
const sleeps = totalDays;
const moons = Math.floor(totalDays / 29.53);
const dayOfWeek = DAYS_OF_WEEK[dob.getDay()];
const birthMonth = MONTHS[dob.getMonth()];
// Render
document.getElementById('birthday-banner').classList.toggle('hidden', !isToday);
document.getElementById('big-age').innerHTML =
`<span>${years}</span> yr ${months} mo ${days} day${days !== 1 ? 's' : ''}`;
document.getElementById('born-day').textContent =
`You were born on a ${dayOfWeek}, ${birthMonth} ${dob.getDate()}, ${dob.getFullYear()}`;
document.getElementById('val-days').textContent = fmt(totalDays);
document.getElementById('val-weeks').textContent = fmt(totalWeeks);
document.getElementById('val-months').textContent = fmt(totalMonths);
document.getElementById('val-hours').textContent = fmt(totalHours);
document.getElementById('val-next-bday').textContent = isToday ? 'Today!' : fmt(nextBdayDays);
document.getElementById('val-next-age').textContent = isToday ? `${years} ✓` : String(nextAge);
document.getElementById('val-heartbeats').textContent = fmt(heartbeats);
document.getElementById('val-breaths').textContent = fmt(breaths);
document.getElementById('val-sleeps').textContent = fmt(sleeps);
document.getElementById('val-moons').textContent = fmt(moons);
document.getElementById('result-section').classList.remove('hidden');
}