Ich glaube, dass in diesem Fall die Lesbarkeit manchmal wichtiger ist. Solange wir nicht Tausende von Feldern validieren, sollte dies genau und schnell genug sein:
function is18orOlder(dateString) {
const dob = new Date(dateString);
const dobPlus18 = new Date(dob.getFullYear() + 18, dob.getMonth(), dob.getDate());
return dobPlus18 .valueOf() <= Date.now();
}
// Testing:
console.log(is18orOlder('01/01/1910')); // true
console.log(is18orOlder('01/01/2050')); // false
// When I'm posting this on 10/02/2020, so:
console.log(is18orOlder('10/08/2002')); // true
console.log(is18orOlder('10/19/2002')) // false
Mir gefällt dieser Ansatz, anstatt eine Konstante für die Anzahl der Monate in einem Jahr zu verwenden und später mit den Schaltjahren usw. herumzuspielen. Ich lasse einfach das eingebaute Datum die Arbeit machen.
Aktualisierung, Veröffentlichung dieses Schnipsels, da er vielleicht nützlich ist. Da ich eine Maske für das Eingabefeld erzwinge, um das Format von mm/dd/yyyy
und bereits zu überprüfen, ob das Datum gültig ist, in meinem Fall funktioniert dies auch, um 18+ Jahre zu überprüfen:
function is18orOlder(dateString) {
const [month, date, year] = value.split('/');
return new Date(+year + 13, +month, +date).valueOf() <= Date.now();
}