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');
  }