13.8.2006

Nachtrag zum Kalenderproblem

Posted in Chaos & Illusion at 22:43 by Rafayel

Ausloeser fuer diesen Beitrag war ja die Frage, wie man in der Programmiersprache PHP den Abstand zwischen zwei Terminen bzw. Daten menschenverstaendlich (x Jahre, y Monate, z Wochen etc.) ausdrueckt. In den Kommentaren des fragenden Artikels habe ich eine Loesungsidee von mir verlinkt und da sie evtl. auch fuer andere interessant sein koennte (und die Links nicht lange gueltig bleiben), moechte ich sie in diesem Beitrag Google-freundlicher vorstellen.

Grundlage ist das Prinzip des Auffuellens: Ich ueberlege mir, wie oft ein komplettes Jahr (mit Beachtung von Schalttagen und unterschiedlichen Monatslaengen) in die gegebene Zeitspanne passt. Nachdem ich den Zeitraum soweit wie moeglich mit Jahren aufgefuellt habe, probiere ich es als naechstes mit kuerzeren Intervallen, also Monaten. So verfaehrt man fort, bis man bei der kleinsten Einheit, in diesem Fall Sekunden, angekommen ist. PHP sorgt mit der Funktion strtotime() dafuer, dass alle Sonderfaelle im Kalender beachtet werden und das Resultat ist bestechend einfach, wenn auch alles andere als elegant.

<?php
$from = mktime(12, 0, 0, 8, 13, 2006);
$till = mktime(11,59,59, 8, 12, 2016);

$diff = array('year','month','week','day','hour','minute','second');
$count = array(0, 0, 0, 0, 0, 0, 0);
$tmpdate = $from;

for ($i = 0 ; $i < 7 ; $i++)
  while (strtotime("+1 ".$diff[$i], $tmpdate) <= $till) {
    $tmpdate = strtotime("+1 ".$diff[$i], $tmpdate);
    $count[$i]++;
  }

echo date("d.m.Y H:i:s", $from)."<br>";
echo date("d.m.Y H:i:s", $till)."<br>";
echo join($count, " - ");
?>

Das Codefragment ist wirklich nur als proof-of-concept zu verstehen, denn weder ist PHP meine Haus-und-Hof-Sprache noch habe ich mir bei dem Entwurf Muehe in punkto "sauberes" Programmieren gegeben.

2 Responses to “Nachtrag zum Kalenderproblem”

  1. indeed Says:

    Nicht elegant, pah! Ich habe mir die ganze Nacht den Kopf zerbrochen, wie man das eleganter lösen könnte.

  2. Rafayel Says:

    Tsts, jetzt bin ich auch noch Schuld, wenn du total uebermuedet bist. Keine gute Sache, das.

    Aber ich habe nicht behauptet, dass es eleganter geht, nur dass es nicht elegant ist. ;)
    Wobei ich mir ziemlich sicher bin, dass schoenere Wege zum Loesen des Problems existieren; wer Ideen hat, immer her damit.

Leave a Reply

You must be logged in to post a comment.