JavaScript Volljährigkeitsprüfung

[ChAoZ]

Rear Admiral
Registriert
Jan. 2010
Beiträge
5.288
Hallo zusammen,

ich habe einen Bug in einem Alter-Validator und komme leider zur keine befriedigenden Lösung.

Code:
var customerBirthDate = new Date('1996-09-22');
    customerBirthDate.setHours(0, 0, 0, 0);

var nowDate = new Date(); // 2014-09-22
    nowDate.setHours(0, 0, 0, 0);

console.log(customerBirthDate); // Sun Sep 22 1996 00:00:00 GMT+0200
console.log(nowDate); // Mon Sep 22 2014 00:00:00 GMT+0200

var age = nowDate.getTime() - customerBirthDate.getTime();
    age /= 31557600000; // 31557600000 = 24 * 3600 * 365.25 * 1000 = julianisches Jahr in ms

console.log(age); // 17.998631074606433

Aufrunden würde auch 17 Jährige zulassen.
Abrunden würde 18 Jährige ausschließen.

Frage: wie berechnet ich das exakte Alter bzw. wo ist der Wurm im meinem Code?
Danke
 
Mit der Date API von JavaScript würde ich grundsätzlich gar nichts(!) machen. Das ist die reinste Folter und auf manchen Browsern foltert sie besser als auf anderen ;)

Für solche Dinge gibt es Librarys: http://momentjs.com/

Es ist ja einfach nur:

Code:
return EINGEGEBENES_GEBURTSDARUM + 18_JAHRE <= TODAY
 
Brauchst du eine sekundengenaue Berechnung oder genügt es tagesgenau? Falls tagesgenau reicht, setze doch das NowDate auf 23:59:59 Uhr.
 
Paule, steht auf deinem Perso neben dem Geburtstag auch noch eine Uhrzeit? Und ich könnte mich irren, aber ich glaube es heißt nicht grundlos Geburtstag. ;)


Und es ändert auch nichts daran, dass sein Algorithmus vermutlich ein unter Einwirkung von Bier entstandener Alkorithmus ist :D
Lösungen ohne Division sind im Grunde immer vorzuziehen. Man sieht ja selbst was passiert, wenn man es versucht...
 
Zuletzt bearbeitet:
Warum umständlich mit Timestamps rumschlagen? Du hast doch bereits Objekte vor dir...
Code:
function IsMinYears( GivenDate, MinimumYears )
{
	var Diff = new Date();
	return Diff.setFullYear( Diff.getFullYear() - (MinimumYears + 0) ) - (new Date( GivenDate + '' )) > 0;
}

var c = [
    '1992-09-22',
    '1993-09-22',
    '1993-09-23',
    '1994-09-22',
    '1995-09-22',
    '1996-09-22',
    '1996-09-23',
    '1997-09-23',
    '1998-09-23'
  ];
for( var i = 0, e = c.length; i < e; ++i )
{
  console.table( {
    Datum: c[i],
    Mindestens16: IsMinYears( c[i], 16 ),
    Mindestens18: IsMinYears( c[i], 18 ),
    Mindestens21: IsMinYears( c[i], 21 )
  } );
}
Ausgabe:
Code:
"Datum"	"1992-09-22"
"Mindestens16"	true
"Mindestens18"	true
"Mindestens21"	true
"Datum"	"1993-09-22"
"Mindestens16"	true
"Mindestens18"	true
"Mindestens21"	true
"Datum"	"1993-09-23"
"Mindestens16"	true
"Mindestens18"	true
"Mindestens21"	false
"Datum"	"1994-09-22"
"Mindestens16"	true
"Mindestens18"	true
"Mindestens21"	false
"Datum"	"1995-09-22"
"Mindestens16"	true
"Mindestens18"	true
"Mindestens21"	false
"Datum"	"1996-09-22"
"Mindestens16"	true
"Mindestens18"	true
"Mindestens21"	false
"Datum"	"1996-09-23"
"Mindestens16"	true
"Mindestens18"	false
"Mindestens21"	false
"Datum"	"1997-09-23"
"Mindestens16"	true
"Mindestens18"	false
"Mindestens21"	false
"Datum"	"1998-09-23"
"Mindestens16"	false
"Mindestens18"	false
"Mindestens21"	false
 
benneque schrieb:
Für solche Dinge gibt es Librarys: http://momentjs.com/

Es ist ja einfach nur:

Code:
return EINGEGEBENES_GEBURTSDARUM + 18_JAHRE <= TODAY
Danke aber für einen einzigen Validator 10kb extra JS geht gar nicht... mein Team würde mich köpfen^^

benneque schrieb:
Und es ändert auch nichts daran, dass sein Algorithmus vermutlich ein unter Einwirkung von Bier entstandener Alkorithmus ist ...
Das würde ja bedeuten dass einige Kollegen hier Alkohol am Arbeitsplatz konsumieren...
Das würde einiges erklären^^

@Yuuri
Danke, funzt.
Manchmal sieht man den Wald vor lauter Bäume nicht :)
 
[ChAoZ] schrieb:
Das würde ja bedeuten dass einige Kollegen hier Alkohol am Arbeitsplatz konsumieren...
Das würde einiges erklären^^

Dann kannst du ja gleich mal anfragen, ob du was abhaben kannst :D

Aber hast schon recht, wenn man nur an einer einzigen Stelle mit Datums- und Zeitangaben jonglieren muss, würde ich mir das mit der Lib auch noch mal überlegen. Ich hab in meinen Projekten halt ständig damit zu tun (bzw. mein Kollege, der das Frontend schreibt) und deshalb ist immer moment.js mit dabei.

Aber der Code da oben ... ich dachte erst, es sei so ein kleines just-4-fun JavaScript Projekt zum lernen und rumspielen.

Du siehst aber ein, dass man mit "EINGEGEBENES_GEBURTSDARUM + 18_JAHRE <= TODAY" (oder dasselbe nur anders angeordnet von Yuuri: "TODAY - 18_JAHRE + EINGEGEBENES_GEBURTSDARUM > 0") sehr einfach zum Ziel kommt, ohne mit Kommazahlen arbeiten zu müssen und Angst vor Rundungsfehlern haben zu müssen?
 
benneque schrieb:
Du siehst aber ein, dass man mit "EINGEGEBENES_GEBURTSDARUM + 18_JAHRE <= TODAY" (oder dasselbe nur anders angeordnet von Yuuri: "TODAY - 18_JAHRE + EINGEGEBENES_GEBURTSDARUM > 0") sehr einfach zum Ziel kommt, ohne mit Kommazahlen arbeiten zu müssen und Angst vor Rundungsfehlern haben zu müssen?
Joa schon.
Wie schon gesagt müssen oft fremde Personen einen Blick auf den Code werfen um den (Logik)Fehler sofort zu erkennen, wer kennt es nicht?!^^

Danke euch nochmal allen zusammen.
 
Zurück
Oben