const inputDob = document.getElementById('dob'),
inputYear = document.getElementById('year'),
output = document.getElementById('output'),
now = new Date(),
[currentYear, currentMonth, currentDate] = [now.getFullYear(), now.getMonth(), now.getDate()],
days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
tenses = {
date: {
past: 'was on a',
present: 'is today,',
future: 'will be on a'
},
age: {
past: 'was',
present: 'am',
future: 'will be'
}
};
const calculateAge = () => {
const year = Number(inputYear.value),
bdayParts = inputDob.value.split('-').map((e,i) => Number(e) - (i === 1 ? 1 : 0)),
bday = new Date(...bdayParts),
[bdayYear, bdayMonth, bdayDate] = [bday.getFullYear(), bday.getMonth(), bday.getDate()],
currentAge = currentYear - bdayYear - (
(bdayMonth < currentMonth ||
(bdayMonth === currentMonth && bdayDate <= currentDate)
) ? 0 : 1
);
bday.setFullYear(year);
const [ month, date, day ] = [ bday.getMonth(), bday.getDate(), days[bday.getDay()] ],
previousBday = new Date(year - 1, month, date),
age = year - bdayYear,
dateTense =
year < currentYear ||
(year === currentYear &&
(month < currentMonth ||
(month === currentMonth && date < currentDate)
)
)
? 'past'
: year === currentYear && month === currentMonth && date === currentDate
? 'present'
: 'future',
dateTenseString = tenses.date[dateTense],
ageTense = age === currentAge ? 'present' : (dateTense === 'present' ? 'past' : dateTense),
ageTenseString = tenses.age[ageTense];
output.innerHTML = `<span class="${ageTense}">In <b>${year}</b>, my birthday ${dateTenseString} <b>${day}</b>, and I ${ageTenseString} <b>${age} years old</b>.</span>`;
};
calculateAge();
document.addEventListener('input', calculateAge);
body {
display: flex;
flex-direction: column;
gap: 10px;
font-family: Arial, sans-serif;
font-size: 14px;
}
span { margin-top: 0px; }
b { font-size: 120%; }
<label>My birthdate is <input id="dob" type="date" value="1990-01-01" placeholder="mm/dd/yyyy"></label>
<label>What was my birthday in the year <input id="year" type="number" value="2000"></label>
<span id="output"></span>