Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

php: alter in monaten zu geburtstag ermitteln

Empfohlene Antworten

Veröffentlicht

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?:P

hm vielleicht einfach das alter ermitteln und dann *12 für 12 Monate?

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]

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.

das wirst du schon hinbekommen



//*** 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.

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;

}

$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 ;) )

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...)

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.

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()?

...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.

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 :(

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...

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 :D

Also ich bin der Meinung: Mach deine Algorithmen immer, wie wenn sie 30000mal laufen sollen.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.