slomoman Geschrieben 13. Januar 2008 Geschrieben 13. Januar 2008 Ich habe das Geburtstagsdatum einer Person und möchte dazu das Alter in Monaten ermitteln. Ich finde gerade nicht die richtige(n) Funtion(en) dazu. Kann mir jemand auf die Sprünge helfen? Zitieren
thomas0 Geschrieben 13. Januar 2008 Geschrieben 13. Januar 2008 hm vielleicht einfach das alter ermitteln und dann *12 für 12 Monate? Zitieren
ZuVieL Geschrieben 14. Januar 2008 Geschrieben 14. Januar 2008 function datum ($gebdate) { $alter = 0; // Umbauen Datum in die Form JJJJMMTT $gebdt = explode(".", $gebdate); $gebdt = $gebdt[2].$gebdt[1].$gebdt[0]; $now = date("Ymd", time()); if ($gebdt > $now) { print "Geburtsdatum $gebdate ist ungültig<br>\n"; } else { while ($gebdt < $now - 9999) { $alter++; $gebdt = $gebdt + 10000; } } $months = $alter * 12; return $months; }[/PHP] Zitieren
slomoman Geschrieben 14. Januar 2008 Autor Geschrieben 14. Januar 2008 This will not work, if the age is below 1 year, right? If the person is 0 years and 2 months old, i would like to get 2 months, not 0 months. Zitieren
ZuVieL Geschrieben 14. Januar 2008 Geschrieben 14. Januar 2008 das wirst du schon hinbekommen Zitieren
TDM Geschrieben 14. Januar 2008 Geschrieben 14. Januar 2008 Monate bis Ende des Jahres + Jahre * 12 bis Anfang aktuelles Jahr + Monate bis aktueller Monat. :floet: Zitieren
geloescht_JesterDay Geschrieben 14. Januar 2008 Geschrieben 14. Januar 2008 //*** Zeigt bei gegebenem Geburtsdatum (als String, TT.MM.YYYY) das Alter in Monaten an function ageToMonths(aBirthdate) { //*** Alter als timestamp %date = explode(".", aBirthdate); aAge = time() - mktime(0, 0, 0, $date[1], $date[0], $date[2]); //*** Jahre des Alters aYears = date("y", aAge); //*** Monate des alters aMonths = date("n", aAge); //*** Rückgabe in Monaten return aYears * 12 + aMonths; } Das ist jetzt nicht getestet (Arbeite mit php nicht mehr ), aber sollte das tun was du willst: Es wird erst das Alter als Timestamp bestimmt (aktuelles Datum - Geburtsdatum) und daraus dann die Jahre und die Monate bestimmt. Jahre * 12 + Monate ist dein Ergebnis. Zitieren
slomoman Geschrieben 20. Januar 2008 Autor Geschrieben 20. Januar 2008 Hab das coding mal versucht, aber es liefert unsinnige Werte zurück. Ich nehme an, dass die DATE Funktion nicht die Anzahl an Jahren aus einer Differenz zweier Timestamps ermitteln kann. Hier mein erfolgloser Versuch: //* returns number of months for given birthday date public static function ageToMonths( $birthdate ){ // get age as timestamp $date = explode("-", $birthdate); //we expect this format: 1977-12-05 //echo 'date0:'.$date[0]; //year //echo 'date1:'.$date[1]; //month //echo 'date2:'.$date[2]; //day $age_timestamp = mktime(0, 0, 0, $date[1], $date[2], $date[0]); $now_timestamp = time( ); $age = $now_timestamp - $age_timestamp; // get number of years $years = date("y", $age); //will not work //echo 'years:'.$years; // get number of month in last year (0-11) $months = date("n", $age); // return number of months return $years * 12 + $months; } Zitieren
geloescht_JesterDay Geschrieben 21. Januar 2008 Geschrieben 21. Januar 2008 $age = $now_timestamp - $age_timestamp; Was steht denn da für ein Datum? Lass dir doch zum Testen mal alle Daten ausgeben: echo date("m.d.y", $now_timestamp); echo date("m.d.y", $age_timestamp); echo date("m.d.y", $age); [/php] (natürlich bissl formatiert, wegen umbrüchen etc ) Zitieren
TheFinn Geschrieben 21. Januar 2008 Geschrieben 21. Januar 2008 Moin! Kann es sein, daß Ihr zu kompliziert denkt? Ich habe die Aufgabe so verstanden: gefragt ist die Anzahl der vollen Monate, die seit dem Monat vergangen sind, in dem die Person geboren wurde. M.W. rechnet man in so einem Fall unabhängig von der Länge der Monate, d.h. vom 20. bis zum 20. des nächsten Monats ist es immer ein Monat, egal, wie viele Tage der Monat tatsächlich hat. Ich habe also 6 Zahlen: $jetztjahr, $jetztmonat, $jetzttag, $gebjahr, $gebmonat, $gebtag Dann kann ich doch einfach rechnen $monate = ($jetztjahr - $gebjahr) * 12; if ($jetztmonat > $gebmonat) { $monate += $jetztmonat - $gebmonat; } if ($jetzttag < $gebtag) { $monate--; } (Ungetestet und nicht sauber für den Fall, daß der Kleine erst diesen Monat geboren wurde, aber dafür brauch ich kein PHP...) Zitieren
geloescht_JesterDay Geschrieben 21. Januar 2008 Geschrieben 21. Januar 2008 Kann es sein, daß Ihr zu kompliziert denkt? Nein, ich würde eher sagen du zu einfach (*). (Was nicht heißt, dass der Weg nicht geht, bis auf ein paar Ausnahmen z.B.) Die Überlegung ist ganz einfach die, dass ein Unix-timestamp die Anzahl der Sekunden seit einem Datum X ist. Dies wird durch Datumsfunktionen dann wieder in ein "lesbares" Datum gewandelt. Die Differenz Jetzt - Geburtsdatum als Unix-Timestamps ist also gleich der Anzahl Sekunden, die die Person alt ist. Die nächste Überlegung dann war (und das war eher der komplizierte Teil), dass wiederum als ein Datum zu sehen und die Infos daraus zu holen. Der Schritt könnte nicht ganz korrekt sein, hab das ja nicht ausprobieren können. Und außerdem geht der auch nur bis 99 Jahre. Ich finde diesen Weg viel sauberer und auch nicht komplizierter als die Überlegung wie ich Jahre und Monate verbinden muss und dann noch Ausnahmen abfangen (über etliche IFs). *: Wobei die Überlegungen was ich für ausnahmen beachten muss u.ä. bei dir IMHO komplizierter sind als meine. Zitieren
TheFinn Geschrieben 21. Januar 2008 Geschrieben 21. Januar 2008 Nein, ich würde eher sagen du zu einfach (*). (Was nicht heißt, dass der Weg nicht geht, bis auf ein paar Ausnahmen z.B.) Die Überlegung ist ganz einfach die, dass ein Unix-timestamp die Anzahl der Sekunden seit einem Datum X ist. Dies wird durch Datumsfunktionen dann wieder in ein "lesbares" Datum gewandelt. Die Differenz Jetzt - Geburtsdatum als Unix-Timestamps ist also gleich der Anzahl Sekunden, die die Person alt ist. Ist mir klar. Die nächste Überlegung dann war (und das war eher der komplizierte Teil), dass wiederum als ein Datum zu sehen und die Infos daraus zu holen. Der Schritt könnte nicht ganz korrekt sein, hab das ja nicht ausprobieren können. Ich fürchte, der ist auch ohne Ausprobieren nicht korrekt, denn Dein Code 'verschiebt' die Lebensspanne der Person, indem er ihren Geburtstag auf den 1.1.1970 verlegt. Dann hat die Person natürlich immer noch das gleiche Alter in Sekunden, aber nicht mehr notwendigerweise in Tagen bzw. Monaten, denn zwischen dem 1.1.1970 und ihrem Sekundenalter kann eine andere Anzahl von Schaltjahren liegen als zwischen ihrem tatsächlichen Geburtstag und heute. Ich finde diesen Weg viel sauberer und auch nicht komplizierter als die Überlegung wie ich Jahre und Monate verbinden muss und dann noch Ausnahmen abfangen (über etliche IFs). Hmm, was ist teurer: zwei IFs und etwas Arithmetik oder mktime() + time () + zweimal date()? Zitieren
geloescht_JesterDay Geschrieben 22. Januar 2008 Geschrieben 22. Januar 2008 ...denn Dein Code 'verschiebt' die Lebensspanne der Person, indem er ihren Geburtstag auf den 1.1.1970 verlegt. Hm, stimmt. Für den der das später pflegt oder erweitert auf jeden Fall die IFs Und du hast ja vergessen, dass du deine Daten auch erst noch ermitteln musst. Aus einem String (wenn direkt eingegeben), oder einem DateTime-Wert (wenn es irgendwo gespeichert war). Hier eine Mischung aus den beiden Lösungen: $endDate = time(); $startDate = $birthDate; // wo immer das herkommt $months_between = ((idate('Y', $endDate) * 12) + idate('m', $endDate)) - ((idate('Y', $startDate) * 12) + idate('m', $startDate)); [/php] Einfach die Monate bis Heute (Jahr (YYYY) * 12 + Monat) minus die Monate bis zum Geburtsdatum. Zitieren
TheFinn Geschrieben 22. Januar 2008 Geschrieben 22. Januar 2008 Für den der das später pflegt oder erweitert auf jeden Fall die IFs Wir können uns ja evtl. darauf einigen, daß das stark davon abhängt, ob das Ding eher 3 mal laufen muß oder eher 30000 mal... Und du hast ja vergessen, dass du deine Daten auch erst noch ermitteln musst. Aus einem String (wenn direkt eingegeben), oder einem DateTime-Wert (wenn es irgendwo gespeichert war). Ich habe es nicht vergessen, sondern unterschlagen, es ging mir nur um die Berechnung. Die Aufbereitung der Daten für die Funktion fällt ja in jedem Fall an. Hier eine Mischung aus den beiden Lösungen: $endDate = time(); $startDate = $birthDate; // wo immer das herkommt $months_between = ((idate('Y', $endDate) * 12) + idate('m', $endDate)) - ((idate('Y', $startDate) * 12) + idate('m', $startDate)); [/php] Einfach die Monate bis Heute (Jahr (YYYY) * 12 + Monat) minus die Monate bis zum Geburtsdatum. OK, auf diese Weise sparst Du Dir die IF-Abfragen, was natürlich wesentlich eleganter ist. Da war ich bei meinem ersten Vorschlag wirklich bräsig... Die Zahlen für die Rechnung aus idate zu holen, ist allerdings keine so gute Idee, da idate integer-Werte zurückliefert, d.h. idate('Y', $enddate) liefert derzeit 4 und nicht etwa 2004... Äh, 8 statt 2008 meinte ich (an den Kopf fass...) Vergiß das, was ich gerade gesagt habe. Oh Mann, ich hätte heute im Bett bleiben sollen Zitieren
TheFinn Geschrieben 22. Januar 2008 Geschrieben 22. Januar 2008 Die Zahlen für die Rechnung aus idate zu holen, ist allerdings keine so gute Idee, da idate integer-Werte zurückliefert, d.h. idate('Y', $enddate) liefert derzeit 4 und nicht etwa 2004... Äh, 8 statt 2008 meinte ich (an den Kopf fass...) Vergiß das, was ich gerade gesagt habe. Oh Mann, ich hätte heute im Bett bleiben sollen Nur zur Erklärung: mein Vorbehalt gegen idate stützte sich auf eine Anmerkung zu dieser Funktion in der Datei php_manual_de.chm, also dem 'offiziellen' PHP-Handbuch (wenn sich das auch auf irgendeine Version von 2006 bezieht, schätze ich mal). Diese Anmerkung ist offenbar erstens Unfug und zweitens von mir nicht aufmerksam gelesen worden, sorry... Zitieren
geloescht_JesterDay Geschrieben 22. Januar 2008 Geschrieben 22. Januar 2008 Wir können uns ja evtl. darauf einigen, daß das stark davon abhängt, ob das Ding eher 3 mal laufen muß oder eher 30000 mal... Also meine Erfahrung ist die: Es gibt immer einen Chef/Kunden, der nach einem halben Jahr genau irgendeine Änderung will, wo du Funktionen anfasst, die ja nur 3mal laufen sollten Und die ist dann immer so dringend, dass sie gestern fertig sein muss und dann trotzdem nie genutzt wird Also ich bin der Meinung: Mach deine Algorithmen immer, wie wenn sie 30000mal laufen sollen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.