PHP alter berechnen

nick25

Well-known member
ID: 205997
L
30 Mai 2009
516
24
hallo,

könnte mir jemand helfen diesen schnipsel zu erweitern? es sollen die wochen hinzugefügt werden.

z.b 2 Monate, 2 Wochen und 3 Tage

PHP:
<?php
$byear= 2013;
$bmonth = 05;
$bday = 04;

  // aktuelles Datum als assoziatives Array:
  $today = getdate();

  // Differenzen als assoziatives Array:
  $age['year'] = $today['year'] - $byear;
  $age['month'] = $today['mon'] - $bmonth;
  $age['day'] = $today['mday'] - $bday;

  // Korrektur der negativen Differenzwerte:
  if($age['day'] < 0)
  {
    $age['day'] += cal_days_in_month(CAL_GREGORIAN,$bmonth,$byear);
    $age['month']--;
  }
  if($age['month'] < 0)
  {
    $age['month'] += 12;
    $age['year']--;
  }

echo '<br>Das Lebensalter beträgt '.$age['year'].' Jahre, '.$age['month'].' Monate, und '.$age['day'].' Tage.';  


?>

vielen dank
 
Dazu musst Du lediglich die Tage durch 7 teilen und abrunden, um die Wochen zu erhalten. Anschliessend nimmst Du den ganzzahligen Rest, wenn Du die Tage durch 7 teilst und erhälst so die verbleibenden Tage (der Operator dafür ist modulo bzw. %).

Die letzten Zeilen des Skripts könnten dann so aussehen:
PHP:
<?php
  // ...
  $age['week'] = floor($age['day'] / 7);
  $age['day']  = $age['day'] % 7;

  echo '<br>Das Lebensalter beträgt '.$age['year'].' Jahre, '.$age['month'].' Monate, '.$age['week'].' Wochen, und '.$age['day'].' Tage.';
 
Ich würde diese Art und Weise der Berechnung des Alters übrigens in keinster Weise empfehlen. Ihr macht Euch das unnötig kompliziert mit dieser seltsamen "Jahr-Jahr / Monat-Monat / Tag-Tag und dann die negativen Werte anpassen"-Methode.

Viel einfacher ist es, den Unix-Timestamp des Geburtstags zu ermitteln und diesen vom aktuellen Timestamp abzuziehen. Somit hat man das Alter in Sekunden, welche man relativ simpel in die anderen Einheiten umrechnen kann, ohne mit negativen Werten hantieren zu müssen.
 
Da hast du Recht, das ist mir auch aufgefallen.

Viel weniger Arbeit ist das aber auch nicht, vor allem wenn man es jetzt schon fertig hat.
 
Ich würde diese Art und Weise der Berechnung des Alters übrigens in keinster Weise empfehlen. Ihr macht Euch das unnötig kompliziert mit dieser seltsamen "Jahr-Jahr / Monat-Monat / Tag-Tag und dann die negativen Werte anpassen"-Methode.

Viel einfacher ist es, den Unix-Timestamp des Geburtstags zu ermitteln und diesen vom aktuellen Timestamp abzuziehen. Somit hat man das Alter in Sekunden, welche man relativ simpel in die anderen Einheiten umrechnen kann, ohne mit negativen Werten hantieren zu müssen.

Naja relativ Simpel?
Wenn man die Sekunden hat, fehlt aber einem Ja noch das Wissen, wie viele Schaltjahre gab es...
Habe mir die Berechneung nicht angeschaut, wird das denn mit berücksichtigt, bzw. wie wird das gehandhabt?
 
Warum verwendet ihr eigentlich nicht einfach DateTime::diff ?

das wäre meine 1. Idee gewesen.

der code dafür wäre dann

PHP:
$birthday = new DateTime("1954-03-29");
$diff = $birthday->diff(new DateTime());
echo $diff->format("Du bist %d Tage %m Monate %y Jahre alt");


die Version mit den Wochen wäre dann
PHP:
$birthday = new DateTime("1954-03-14");
$diff = $birthday->diff(new DateTime());
printf("Du bist %d Tage %d Wochen %d Monate %d Jahre alt", $diff->d%7, $diff->d/7, $diff->m, $diff->y);
 
Ach, stimmt. Sehr guter Einwand. Die neuen Funktionen ab PHP 5.3 habe ich irgendwie noch nicht alle wirklich auf dem Schirm.
 
Ok, vergessen wir den ersten Vorschlag.

Aradiv´s Lösung ist meines Erachtens nach wirklich die smarteste. Und das in 3 Zeilen :)

//Habe meinen Artikel auch nochmal überarbeitet und nun die neue Variante mit der TimeStamp Klasse vorgstellt.

dein schnipsel ist das beste was ich überhaupt gefunden habe. könnte man dem um wochen erweitern? es gibt leider bei date() keine wochen

@Aradiv sorry, hab deinen schnippsel übersehen. der funktioniert super.

achja so gut sieht es nich aus wenn steht:

Du bist 1 Jahre 1Monate 1 Wochen 1 Tage alt
 
Zuletzt bearbeitet:
Ja, das ist möglich!

Du musst ja nur die Tage in Wochen umrechnen, also die Tage durch 7 dann hast du die Anzahl der Wochen.

Wenn du aber z.B. 3 Wochen und 4 Tage anzeigt bekommen möchtest, musst du die Anzahl der Wochen abrunden und nochmal den Rest der Division mit 7 berechnen, das sind dann die Tage. :)

Steht alles in meinem Artikel :p
 
PHP:
$birthday = new DateTime("2012-06-20"); 
$diff = $birthday->diff(new DateTime()); 
printf("Du bist %d Tag%s %d Woche%s %d Monat%s %d Jahr%s alt", 
  $diff->d%7, 
  ($diff->d%7 == 1 ) ? '':'e', 
  floor($diff->d/7),  //das floor kann man weg lassen, muss man aber nicht :P 
  (floor($diff->d/7) == 1 ) ? '':'n', //hier muss das floor sein
  $diff->m, 
  ($diff->m == 1 ) ? '':'e', 
  $diff->y, 
  ($diff->y == 1 ) ? '':'e');

Ausgabe:
Du bist 1 Tag 1 Woche 1 Monat 1 Jahr alt

Damit haben auch die Strings richtig :ugly: