User Date of Birth & Age Verification
Validate user-submitted birth dates, verify minimum age requirements (e.g., 18+), and prevent impossible or future birth dates.
400 font-semibold">import { parseDate, addYears, isBefore, isAfter, todayUtc } 400 font-semibold">from 400 font-semibold">class="text-emerald-400">"daysafe";400 font-semibold">interface AgeValidationResult {valid: boolean;error?: string;birthDate?: string;}400 font-semibold">export 400 font-semibold">function validateBirthDate(rawInput: string, minimumAge = 18): AgeValidationResult {400 font-semibold">const birthDate = parseDate(rawInput);400 font-semibold">if (!birthDate) {400 font-semibold">return { valid: 400 font-semibold">false, error: 400 font-semibold">class="text-emerald-400">"Invalid calendar date. Please enter YYYY-MM-DD." };}400 font-semibold">const today = todayUtc();// 1. Cannot be born in the future400 font-semibold">if (isAfter(birthDate, today)) {400 font-semibold">return { valid: 400 font-semibold">false, error: 400 font-semibold">class="text-emerald-400">"Date of birth cannot be in the future." };}// 2. Minimum age threshold (birthDate + minAge <= today)400 font-semibold">const requiredBirthday = addYears(birthDate, minimumAge);400 font-semibold">if (isAfter(requiredBirthday, today)) {400 font-semibold">return {valid: 400 font-semibold">false,error: 400 font-semibold">class="text-emerald-400">`User must be at least ${minimumAge} years old.`};}400 font-semibold">return { valid: 400 font-semibold">true, birthDate };}// Example usage:console.log(validateBirthDate(400 font-semibold">class="text-emerald-400">"2000-05-15")); 400 font-semibold">class=400 font-semibold">class="text-emerald-400">"text-slate-500 italic">// { valid: 400 font-semibold">true, birthDate: 400 font-semibold">class="text-emerald-400">"2000-05-15" }console.log(validateBirthDate(400 font-semibold">class="text-emerald-400">"2026-02-30")); 400 font-semibold">class=400 font-semibold">class="text-emerald-400">"text-slate-500 italic">// { valid: 400 font-semibold">false, error: 400 font-semibold">class="text-emerald-400">"Invalid calendar date..." }console.log(validateBirthDate(400 font-semibold">class="text-emerald-400">"2015-08-10")); 400 font-semibold">class=400 font-semibold">class="text-emerald-400">"text-slate-500 italic">// { valid: 400 font-semibold">false, error: 400 font-semibold">class="text-emerald-400">"User must be at least 18 years old." }
- ✓parseDate strictly validates format and calendar reality without silent rollover.
- ✓addYears handles leap day birthdays (e.g. Feb 29 + 18 years clamps safely to Feb 28).
- ✓todayUtc ensures verification isn't skewed by client machine clock timezone differences.