Mailinglisten-Archive |
Hallo in die Runde,
da man bei Zeitberechnungen immer auf Schaltjahre und auch Sommer- und
Winterzeit achten muss ist es ratsam grundsätzlich mit strtotime() zu
arbeiten, da diese Funktion alles automatisch beachtet.
Es ist zwar sicherlich langsamer damit zu arbeiten, als solche Dinge
explizit zu berechnen, jedoch kann man sich auf die Ergebnisse verlassen.
Zu obigem Problem hier mein (PHP-seitiger) Lösungsvorschlag:
function timeDiff($iFrom, $iTo) {
// check precondition
if ($iFrom > $iTo) { /* throw some exception */ }
// get years
for ($iYears = 0;; $iYears++) {
$iNewTo = strtotime('-1 year', $iTo);
if ($iNewTo < $iFrom) break;
$iTo = $iNewTo;
}
// get months
for ($iMonths = 0;; $iMonths++) {
$iNewTo = strtotime('-1 month', $iTo);
if ($iNewTo < $iFrom) break;
$iTo = $iNewTo;
}
return array('years' => $iYears, 'months' => $iMonths);
}
Diese Funktion ist übersichtlich, man sieht was da passiert und ist
leicht erweiterbar (z.B. für Wochen oder Tage). Folgendes Testskript:
date_default_timezone_set('Europe/Berlin');
print_r(timeDiff( strtotime('1989-11-9') , time() ));
print_r(timeDiff( strtotime('2002-9-11') , time() ));
print_r(timeDiff( strtotime('-1 year') , time() ));
print_r(timeDiff( time() , time() ));
erzeugt ungefähr folgende Ausgabe:
Array ( [years] => 17 [months] => 10 )
Array ( [years] => 5 [months] => 0 )
Array ( [years] => 1 [months] => 0 )
Array ( [years] => 0 [months] => 0 )
Vielleicht nützt es ja jemandem etwas ;-)
Grüße,
Niels
php::bar PHP Wiki - Listenarchive