Alter mit php berechnen

Hi,

hab folgendes problem hab mir ein kleines script geschrieben das mir das alter berechen soll dabei wird die UNIX Zeit verwendet.
Nur hab ich folgendes Problem ich muss ja auch Schaltjahre berücksichtigen nur weiß ich nicht genau wie ich das ganze im script umsetzen soll.
Vielleicht hat ja einer von euch eine Idee wie sich sowas realisieren lässt :smiley:

Hier das was ich bis jetzt hab:

<?php

// DATEN AUS DATENBANK
$tag = date ("d" , $gebdate);
$monat = date ("m" , $gebdate);
$jahr = date ("Y" , $gebdate);

// BERECHNUNG
$jetzt = mktime(0,0,0,date("m"),date("d"),date("Y"));
$geburt = mktime(0,0,0,$monat,$tag,$jahr);
$alter   = intval(($jetzt - $geburt) / (3600 * 24 * 365));
?> 

Das ‘Normjahr’ ist eine Zeitspanne von 365.25 Tagen, das sollte
doch eigentlich reichen ;o)

Dabei muß man bedenken, daß Sekunde, Minute, Stunde, Tag,
Woche und dieses ‘Normjahr’ wohldefinierte Zeitspannen sind,
Monat etwa nicht. Auch das Kalenderjahr ist keine wohldefinierte
Zeitspanne. Die Unix-Zeit ist gemäß seiner Definition eine
näherungsweise wohldefinierte Zeit, weil offenbar die
Schaltsekunden nicht korrekt drinstehen. Die Umrechnung in ein
Kalenderdatum ist dabei eine nicht triviale Angelegenheit (vor
allem auch wegen der unregelmäßigen Schaltsekunden). Bei
Schaltjahren gibt es aber wiederum einfache Regeln, erste
Näherung ist die, daß die alle 4 Jahre stattfinden, wenn die
Jahreszahl durch 4 teilbar ist.
Ausnahme sind Jahre, wo die Jahreszahl durch 100 teilbar ist, das
sind keine Schaltjahre. Sind sie wiederum durch 400 teilbar, sind
es Schaltjahre. Wie man am obigen Wert für das 'Normjahr’
sieht, ist darin nur die Vierjahresregel berücksichtigt.
Schaltsekunden treten unregelmäßig auf und sind in Tabellen
nachzulesen, bislang gab es die wohl nur am Ende eines Jahres.

Die Unix-Zeit basiert auf der UTC ohne Schaltsekunden, also
prinzipiell auf der TAI, woraus dann wohl mittels entsprechender
Regeln und Tabellen für die Schaltsekunden die UTC berechnet
werden kann, was normalerweise PHP für einen mit den
Datumsfunktionen erledigt.

Details wie so oft auch bei wikipedia:
de.wikipedia.org/wiki/Gregorianischer_Kalender
de.wikipedia.org/wiki/Jahr
de.wikipedia.org/wiki/Internationale_Atomzeit
de.wikipedia.org/wiki/UTC
de.wikipedia.org/wiki/Unixzeit

$gebdate=123456789; //Das holst du aus der DB

$alter=date("Y",time()-$gebdate)-date("Y",0);

echo $alter;  //Das ist das Alter...

@ hoffmann wenn ich das ganze auf 365.25 stelle funktioniert es super aber wen der user das 40 lebensjahr überschritten hat tritt eine ungenauigkeit von einem Tag auf…

@michi7x7 dein code funktioniert bei manchem datum super bei anderen hat er abweichungen von 1 Tag… :susp:

Vielen Dank mal euch beiden für die Vorschläge

/EDIT/

@michi7x7 der Fehler in deinem code tritt insofern auf das alle 4 jahre also 2004 und 2008 der betreffende User schon einen Tag vor seinem Geburtstag ein Jahr älter geworden ist also wenn er am 20.5.1980 geburtstag hat ist er bereits am 19.5.2008 28 Jahre alt statt erst am 20.5.2008

In den Jahren 2005 2006 2007 funktioniert das ganze aber super…

Du mußt eben genauer definieren, was deine ‘Meßgröße’ ist
oder was Zeit für dich bedeutet. Die Angabe der Unix-Zeit
sollte auf einem NTP-synchronisierten Rechner eigentlich
stimmen - Sadrak hat mal verraten, daß dies zumindest auf die
kilu-Rechner zutrifft. Die Umrechnung in was anderes als
Sekunden, Minuten, Stunden, Tage, Wochen ist nur ein
Problem, weil diverse Bezeichnungen im Kalender eben keine
präzisen Zeiten oder Zeitspannen sind.

Das mit den 40 Jahren ist interessant, nicht etwa 38?
Am 1970-01-01 ist die Unix-Zeit 0 - kann also sein, daß es
dort bei negativen Unix-Zeiten ein Problem gibt.
Kannst ja mal um das Datum herum prüfen, ob es dort eine
Unstimmigkeit gibt - und was da exakt ins Klo greift, die
Datumsfunktionen von PHP oder etwas anderes?
Tritt es unter Unix/Linux auf oder unter windows oder unter
beiden?
So oder so, wenn es daran liegt, kennt man ja das Problemdatum
und kann dann einfach eine Fallunterscheidung einbauen. Dann
könnte es wieder um 1900 herum ein Problem geben, denn das
war dann ja kein Schaltjahr, da gab es aber auch noch kein
TAI oder UTC - da sah man das ohnehin noch nicht so eng ;o)

Mit 365.25 haben wir aktuell Glück, weil das Jahr 2000 aufgrund
dieser Sonderregel ein Schaltjahr war, sonst gäbe es da schon
ab 8 Jahren eine Unstimmigkeit von einem Tag im Sinne des
Kalenderjahres, nicht im Sinne einer exakten Zeitmessung ;o)

@ hoffmann,

hab das mal geprüft bin mir aber nun ziemlich sicher das es nicht mehr funktioniert wenn der User mehr als 40 Jahre alt ist wen er am 23.5.08 40 jahre alt wird also morgen und ich die zeit auf meiner testumgebung auf morgen vorstelle wird der user aber erst wenn ich die zeit nochmal vorstelle also auf de 24.5.08 40 jahre alt…

Was die Windows / Linux Geschichte angeht das spielt meiner ansicht nach keine rolle hab es jetzt auf linux und Windows probiert und das ganze ist auf beiden Betriebssystem unverändert…

/EDIT/

Wenn ich ein anderes Datum nehme das noch weiter zurückligt dan funktioniert es auch nur nicht im Jahr 1968 komisch oder :qst:

/EDIT/

Das Problem tritt alle 4 Jahre auf im Jahr 1964 funktioniert es auch nicht

1968 wurde die Internationale Atomzeit festgelegt, TAI.
Ich wüßte jetzt aber nicht, daß da sonderlich gemauschelt worden
wäre, das hat man eher in früheren Jahrhunderten gemacht, als
manche Leute noch einen Kaiser hatten ;o)

Mit kürzeren Zeitabständen von Tagen oder Wochen in dem
Bereich könntest du natürlich auch noch herausfinden, wo da
genau der Tag verloren geht. Wenn man jetzt weiß, welcher
Tag eigentlich fehlt, bekommt man ja vielleicht heraus, was
an dem Tag passiert ist und dann vielleicht, warum er fehlt.

Es ist wohl jedenfalls bekannt, daß negative Zeiten unter
windows Probleme machen oder nicht definiert sind, siehe auch
die Notiz im Handbuch:
de3.php.net/manual/de/function.mktime.php
de3.php.net/manual/de/function.date.php
Deswegen ist es interessant zu erfahren, daß Daten jenseits der
0 auch unter windows irgendwas halbwegs sinnvolles liefern.

Hi,
irgendwie bist du im falschen Film, so komm ich mir vor :ps:
Wie wird das Alter seit Generationen ermittelt ?
Die Differenz der Jahre und 1 ab, wenn der Geburtstag dieses Jahr
noch nicht war:

<?php // DATEN AUS DATENBANK $tag = 23; $monat = 5; $jahr = 1908; // BERECHNUNG $alter = date("Y") - $jahr; if(((date("m") -$monat) * 50 + date("d") - $tag) < 0) {--$alter;} echo "Alter: ".$alter; ?>

Mal checken, bin schon müde…
Pit

Da wie oben bereits erläutert, weder Monat noch Kalenderjahr
eine eindeutig definierte Zeitspanne sind, ist das dann ein mehr
oder weniger grober Schätzwert.

Kommt eben immer drauf an, wie genau man das wissen will.
Man könnte ja auch einen ‘Normmonat’ als exakt 365.25/12 Tage
definieren, dann könnte man auch damit rechnen, funktioniert
aber alles schlecht, wenn man Rechnungen anhand der
Kalenderdaten anstellt.
Das ist schon sinnvoll, von den Kalenderdaten in eine
Unix-Zeit umzurechnen, die exakte Differenz zu bestimmen und
das in anschaulichen Einheiten darzustellen.

Bei der Formel stellt sich die Frage, wo die ‘50’ herkommt
(sollten das nicht die 365.25/12 Tage sein ?).
Das Ergebnis hat zudem wohl keine Einheit und hat eine
mittlere Genauigkeit von rund einem halben Jahr …

if(date("m") <$monat || (date("m") == $monat && date("d") < $tag)) $alter--;

so find ich es besser…

Wenn da aber $tag=31 ist, führt das unabhängig vom Monat
dazu, daß meist abgezogen wird, das erhöht die mittlere
Ungenauigkeit auf über ein halbes Jahr ;o)

hab nachgebessert…

Vielen Dank euch allen nun funktioniert es super :smiley:

Ich hab jetzt noch etwas recherchiert und dabei bin ich auf die Datumsfunktion von MySQL gestoßen falls das ganze jetzt aus irgendeinem Grund bei einem bestimmten Datum wieder zicken macht werd ich wohl auf diese Funktion umsteigen…