+1 vote
in SoSci Survey (dt.) by s032520 (195 points)
edited by SoSci Survey

Ich möchte das aktuelle Alter aus dem Geburtsdatum berechnen und dann filtern nach unter 15, 15 Jahre, 16-17 Jahre und mindestens 18 Jahre. Wenn ich mich am Code der Vorgängerfrage orientiere, funktioniert es nicht logisch, die Funktion strtotime('-15 years') gibt bei mir nicht den Wert des aktuellen Datums minus 15 Jahre aus sondern etwas anderes, die Abstände (pro Jahr) sind aber auch nicht immer gleich.

Folgenden Code habe ich zum Testen verwendet:

$born = strtotime(value('SD32_01'));  // Zeitstempel des Geburtstags

$limit15a = strtotime('-15 years');  // Heute vor 15 Jahren
$limit16a = strtotime('-16 years');  // Heute vor 16 Jahren
$limit18a = strtotime('-18 years');  // Heute vor 18 Jahren

if ($born <= $limit15a)  {html('jünger als 15: <b>'.$born.'</b>'.'<br>');}

if (($born < $limit16a) or ($born >= $limit15a)) {html('15 Jahre: <b>'.$born.'</b>'.'<br>');}

if (($born < $limit18a) or ($born >= $limit16a)) {html('zwischen 16 und 18: <b>'.$born.'</b>'.'<br>');
}

if (($born >= $limit18a)) {html('mindestens 18 Jahre: <b>'.$born.'</b>'.'<br>');}

Was ist daran falsch? Kann ich es anders lösen? Ich habe auch schon direkte Vergleiche versucht wie

if (strtotime(value('SD32_01'))>=strtotime("16 years")) and  
   (strtotime(value('SD32_01'))<=strtotime("17 years"))
   {question('TN58');} 

Oder mit "minus" vor der Jahrzahl. Oder aus einer anderen Hilfe die date_create und date_diff Funktion - das ist nicht zugelassen.

Vielen Dank!

1 Answer

+1 vote
by SoSci Survey (328k points)

die Funktion strtotime('-15 years') gibt bei mir nicht den Wert des aktuellen Datums minus 15 Jahre aus sondern etwas anderes

Sind Sie sicher? Denn genau das aktuelle Datum -15 Jahre sollten Sie damit bekommen. Zum Testen:

html('<p>Vor 15 Jahren: '.date('d.m.Y', strtotime('-15 years')).'</p>');

Dann haben Sie diesen Code...

if ($born <= $limit15a)  {html('jünger als 15: <b>'.$born.'</b>'.'<br>');}

Und ich denke, da ist nur ein kleiner Denkfehler drin. Wenn jemand ein früheres Geburtsdatum (<=) als heute vor 15 Jahren hat, dann ist er/sie älter (!) als 15 Jahre.

Es müsste also heißen:

if ($born > strtotime('-15 years')) {
  html('jünger als 15: <b>'.$born.'</b>'.'<br>');
}

Oder auch andersherum möglich, indem SIe prüfen, wann der 15ste Geburtstag ist:

if (strtotime($born, '+15 years') > time()) {
  html('jünger als 15: <b>'.$born.'</b>'.'<br>');
}
by s032520 (195 points)
Super, herzlichen Dank, jetzt klappt es, es scheint tatsächlich am Denkfehler gelegen zu haben.
Was mich wunderte, war folgendes (ohne Formatierung)
html('<p>Vor 15 Jahren: '.date('d.m.Y', strtotime('-15 years')).'</p>');   
html('<p>S(-15 years): '.strtotime('-15 years').'</p>');   
html('<p>S(24.09.2004): '.strtotime('24.09.2004').'</p>');   

Es kommt heraus:
Vor 15 Jahren: 24.09.2004
S(-15 years): 1096058561
S(24.09.2004): 1095976800
Die letzten zwei Zahlen stimmen nicht überein, das mag aber vlt. an Uhrzeiteffekten liegen.. nur die Abstände bei -15, -16, -17 .. Jahren oder kleineren Zahlen waren auch nicht identisch, es passte irgendwie alles nicht.

Folgende Lösung funktioniert jetzt für die Differenzierung (wegen Elterneinverständnis etc.):
$born = strtotime(value('SD32_01'));  // Zeitstempel des Geburtstags

// Kind jünger als 15 Jahre
if ($born>strtotime('-15 years'))
   {text('Kind_unter_15');
    goToPage('Ende');}
  
//Kinder 15 (wenn bald Geburtstag zB, jetzt schon Einverständnis einholen)
if (($born<=strtotime('-15 years')) and  
   ($born>strtotime('-16 years')))
   {html('<p>Sie können das Einverständnis jetzt bereits geben, Ihr Kind kann jedoch erst ab dem 16. Geburtstag an der Umfrage teilnehmen.</p>');
   question('TN58');}

//Kinder 16-17 Jahre - Einverständnis einholen
if (($born<=strtotime('-16 years')) and  
   ($born>strtotime('-18 years')))
   {question('TN58');}
  
//Kinder ab 18 Jahre - kein Einverständnis der Mutter nötig
if ($born<=strtotime('-18 years'))
   {goToPage('Mdem');}

Vielen Dank für die schnelle Hilfe!
by SoSci Survey (328k points)
Der Vollstänndigkeit halber: Ja, strtotime() ist auf die Sekunde genau. Jetzt vor 15 Jahren ist 22 Stunden und 41 Minuten später als 25.09.2004 (null Uhr).

Was Sie dort an Zahlen sehen sind Unix-Zeitstempel (Sekunden seit dem 1.1.1970, 0 Uhr). Mittels date() kann man diese wieder in ein lesbares Datum umwandeln.
by s032520 (195 points)
Herzlichen Dank! Und die Unterschiede (der Zahl in Sekunden) zwischen verschiedenen Jahren lagen vermutlich am "Schaltjahr".

Willkommen im Online-Support von SoSci Survey.

Hier bekommen Sie schnelle und fundierte Antworten von anderen Projektleitern und direkt von SoSci Survey.

→ Eine Frage stellen


Welcome to the SoSci Survey online support.

Simply ask a question to quickly get answers from other professionals, and directly from SoSci Survey.

→ Ask a Question

...