Zum Inhalt springen

Empfohlene Beiträge

Geschrieben
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]

Geschrieben



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

Geschrieben

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;

}

Geschrieben

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

Geschrieben

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.

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

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

Geschrieben

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

Geschrieben

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

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...