Alter in Jahre UND Tage ausgeben lassen!

Oder: weiß jemand ein fertiges script?

Ich habe mim Moment nicht sehr viel Zeit, und die Page soll bald fertig werden.

Ich wäre über alles froh.

Und so extrem genau muss es auch nicht sein.

Allerdings soll nicht sein, dass an seinem 16. Geburtstag da steht:
15 Jahre und 355 Tage, oder so...


Danke
 
Man kann mit date("L") herausfinden ob es sich um ein Schaltjahr handelt oder nicht.
Wer es komplizierter mag, kann sich ja mal meine Funktion anschauen:
PHP:
<?php
function schaltjahr($jahr){
    if(($jahr % 400) == 0){
        $sj = TRUE;
    } else {
        if(($jahr % 100) == 0){
            $sj == FALSE;
        } else {
            if(($jahr % 4) == 0){
                $sj == TRUE;
            } else {
                $sj == FALSE;
            }
        }
    }
    return $sj;
}

$bla = schaltjahr("2000");
if ($bla == TRUE){echo "Schaltjahr";}else{echo "Kein Schaltjahr";}
?>

Ich habe mir auch für die genaue Altersberechnung ein Konzept einfallen lassen. Es muss nur noch in PHP geschrieben werden. Beispiel:

Jemand ist am 10. Februar 1980 geboren worden. Wenn man nun bis zum nächsten Geburtstag rechnen will, springt man vom 10. Februar 1980 zum 10. Februar 1981 und überprüft jedes Jahr auf seine Eigenschaft als Schaltjahr. Die Summe der Schaltjahre rechnen man zusammen. Sobald das aktuelle Jahr übereinstimmt wird überprüft ob der Geburtstag schon gewesen ist oder noch sein wird. Die Differenz zwischen Geburtstag und und tatsächlichem Datum wird entweder addiert oder subtrahiert, ebenso wie die Schaltjahre noch hinzugerechnet werden. Und schon sollte man einen korrekten Jahres-/Tage-Rechner haben :-)
 
Das könnte weiter helfen?

PHP:
<?php

//--------------------------------------------------

function calculate_age($day, $month, $year){
	$age = array(0, 0, 0);
	$cyr = $year;
	
	if(checkdate($month, $day, $year)){
		$birthday = mktime(0, 0, 0, intval($month), intval($day), intval($year));
		
		if($birthday < time()){
			for($days=$birthday;$days<=time();$days=$days+86400){
				if(checkdate(date("m", $days), date("d", $days), date("Y", $days))){
					if(date("Y", $days) != $cyr){
						$age[1] = 0;
						$age[2]++;
						$cyr = date("Y", $days);
						}
					
					$age[0]++;
					$age[1]++;
					}
				}
			}
		}
	
	return $age;
	}

//--------------------------------------------------

$birthday = strtotime("1982-05-01");

print_r(calculate_age(date("d", $birthday), date("m", $birthday), date("Y", $birthday)));

?>
Code:
Array
(
    [0] => 8854
    [1] => 207
    [2] => 24
)
also 24 Jahre und 207 Tage... oder 8854 Tage
 
netonme hat gesagt.:
Das könnte weiter helfen?
Im Moment ist eine Unschärfe von ein paar Tagen darin. Je älter eine Person ist, desto größer wird die Unschärfe! Wenn Du jetzt auch noch die Schaltjahre berücksichtigst, sollte Dein Beispiel exakt arbeiten, wenn ich es richtig überflogen habe ;)
 
hi,

habe das Script mal ausprobiert von "netonme". Irgendwas mache ich falsch oder im Script ist noch kleiner Bug. Für die restlichen Tage bekomme ich 208 raus für den heutigen Tag ?
Also das Jahr stimmt, Tage habsch nicht überprüft, aber die restlichen Tage hauen bei mir absolut nicht hin.

Liegt das an einem Copy&Paste-Fehler oder an dem Script

Gruß
 
Zuletzt bearbeitet:
Bei mir zeigt er für den heutigen Tag einen Gesamttag/Restag.

Wie ich schon schrieb, bisher ist noch eine Unschärfe vorhanden + fehlende berücksichtigung der Schaltjahre. Und eine kleine Anmerkung: Das Script wird mit größerem Alter der Person immer länger arbeiten, da es ALLE Tage abklappert (am Beispiel 1982 mit fast 9000 Tagen gut zu sehen). Jetzt gebt mal zum Spaß 1950 ein :-) (ca. 20000 Tage und ca. eine Minute Berechnungszeit - je nach Rechner)
Die Idee ist ganz gut, aber nicht sehr performant!
 
Hallo!

Aber warum denn (um bei den Beispieljahren zu bleiben) von 1982 bzw. 1950 an rechnen?
Es langt doch wenn die Tage vom letzten Geburtstag bis zum aktuellen Tag gezählt werden.

Gruss Dr Dau
 
Hallo,

hier mal mein Vorschlag:

PHP:
<?php

$birthday = array('mday' => 10, 'mon' => 8, 'year' => 1985);

function getdate_for_day($year, $month, $day) {
	return getdate(mktime(0, 0, 0, $month, $day, $year));
}

function age($birthday) {
	$now = getdate();

	$age = array(
		'years' => $now['year'] - $birthday['year'],
		'days' => -1
	);
	
	if (($now['mon'] < $birthday['mon']) ||
		($now['mon'] == $birthday['mon'] && $now['mday'] < $birthday['mday'])) {
		$age['years']--;
		$last_birthday = getdate_for_day($now['year']-1, $birthday['mon'], $birthday['mday']);
		$last_nye = getdate_for_day($now['year']-1, 12, 31);
		$age['days'] = $now['yday'] + ($last_nye['yday'] - $last_birthday['yday'] + 1);
	} else {
		$last_birthday = getdate_for_day($now['year'], $birthday['mon'], $birthday['mday']);
		$age['days'] = $now['yday'] - $last_birthday['yday'];
	}

	return $age;
}

print_r(age($birthday));

?>

Grüße,
Matthias
 
Matthias Lösung ist sehr gut. Währenddessen habe ich auch eine Funktion geschrieben, die auf exakt der gleichen Logik wie der von Matthias aufbaut. Mein Aufbau ist nur ein gutes Stück unnötig Komplizierter :-)

Nur damit meine Arbeit nicht umsonst war, hier noch mein Beispiel, obwohl das Beispiel von Matthias die gleichen Ergebnisse bringt:
PHP:
<?php
function agecalc($bd_day,$bd_mon,$bd_year){
    date_default_timezone_set("Europe/Berlin");
    // Berechnung der Jahre
    $now_day = date("d",time());
    $now_month = date("m",time());
    $now_year = date("Y",time());
    $age_years_tmp = ($now_year - $bd_year);
    if($now_month < $bd_mon){
        $age_years = ($age_years_tmp - 1);
        $calc_days = "PRE";
    } elseif($now_month == $bd_mon){
        if ($now_day < $bd_day){
            $age_years = ($age_years_tmp - 1);
            $calc_days = "PRE";
        }elseif ($now_day == $bd_day){
            $age_years = $age_years_tmp;
            $calc_days = "EQUAL";
        }elseif($now_day > $bd_day){
            $age_years = $age_years_tmp;
            $calc_days = "POST";
        }
    } elseif($now_month > $bd_mon){
        $age_years = $age_years_tmp;
        $calc_days = "POST";
    }
    // Berechnung der Tage

    if($calc_days == "PRE"){
        $arr_ylast = getdate(mktime(0,0,0,$bd_mon,$bd_day,$now_year-1));        
        $arr_ylast_end = getdate(mktime(0,0,0,12,31,$now_year-1));
        $arr_ythis_start = getdate(mktime(0,0,0,1,1,$now_year));
        $arr_ythis = getdate(mktime(0,0,0,$now_month,$now_day,$now_year));
        $ylast_d = (($arr_ylast_end['yday'] - $arr_ylast['yday']));
        $ythis_d = ((($arr_ythis['yday']+1) - $arr_ythis_start['yday']));
        $age_days = ($ylast_d + $ythis_d);
    }elseif($calc_days == "EQUAL"){
        $age_days = 0;        
    }elseif($calc_days == "POST"){
    	$arr_bdthis = getdate(mktime(0,0,0,$bd_mon,$bd_day,$now_year));
    	$arr_ythis = getdate(mktime(0,0,0,$now_month,$now_day,$now_year));
    	$age_days = ($arr_ythis['yday'] - $arr_bdthis['yday']);
    }
    
    // Ergebnisse
    
    $validdate = checkdate($bd_mon,$bd_day,$bd_year);
    if($validdate == TRUE){
        return $age_years."-".$age_days;
    }else {
        return "Fehler: Ung&uuml;ltiges Datum";
    }
}


$age = agecalc("20", "8", "1980");
echo $age;
?>

Ich nehme auch einige meiner Aussagen von den letzten Postings zurück. Natürlich muss man nicht alle Schaltjahre berücksichtigen. Wenn man nämlich getdate() benutzt, fließt das Schaltjahr automatisch in die Rechnung ein.
Sorry für's ein wenig verkomplizieren :-)
Meist bemerkt man seine Fehler erst beim Umsetzen :-)
 
Zurück