Alter eines Zeitstempels mit PHP ermitteln

Rainer Schulz » 04. Mai 2011 um 11:33 Uhr

9 Kommentare

PHP 

Vorwort

Ich schreibe schon einige Zeit das Backend für den Blog neu, dabei habe ich auch ein paar kleinere Funktionen geschrieben. Von diesen Funktionen möchte ich euch heute eine vorstellen von der ich denke, dass viele Webentwickler diese gebrauchen können.

Die PHP Funktion

Die folgende Funktion benötigt einen UNIX-Zeitstempel, welcher in der Vergangenheit liegt, als Übergabeparameter. Der übergebene Zeitstempel wird mit dem aktuellen Zeitstempel (time()) verglichen und das Alter berechnet. Ich benutze diese Funktion in der Version 2 dieses Blogs, zum Beispiel um zu zeigen, wie alt ein Artikel oder ein Kommentar ist.

Funktion zum Ermitteln des Alters eines Zeitstempels:
function getSince( $timestamp )
{
    if ( !is_numeric( $timestamp ) ) { return null; }

    $away = time() ‑ $timestamp;

    if ( $away < 60 ) {
        $since = $away.' Sekunde'.( ( $away == 1 ) ? '' : 'n' );
    } elseif ( $away < 3600 ) {
        $tsp = floor( $away / 60 );
        $since = $tsp.' Minute'.( ( $tsp == 1 ) ? '' : 'n' );
    } elseif( $away < 86400 ) {
        $tsp = floor( $away / 60 / 60 );
        $since = $tsp.' Stunde'.( ( $tsp == 1 ) ? '' : 'n' );
    } elseif( $away < 604800 ) {
        $tsp = floor( $away / 60 / 60 / 24 );
        $since = $tsp.' Tag'.( ( $tsp == 1 ) ? '' : 'en' );
    } elseif( $away < 2592000 ) {
        $tsp = floor( $away / 60 / 60 / 24 / 7 );
        $since = $tsp.' Woche'.( ( $tsp == 1 ) ? '' : 'n' );
    } elseif( $away < 31104000 ) {
        $tsp = floor( $away / 60 / 60 / 24 / 30 );
        $since = $tsp.' Monat'.( ( $tsp == 1 ) ? '' : 'en' );
    } elseif( $away < 155520000 ) {
        $tsp = floor( $away / 60 / 60 / 24 / 30 / 12 );
        $since = $tsp.' Jahr'.( ( $tsp == 1 ) ? '' : 'en' );
    } else {
        $since = 'Ewigkeiten';
    }

    return 'vor '.$since;
}

Abschließendes

Für wen diese Funktion noch nicht das Richtige ist, der kann auf PHP.net die Kommentare bei der time()-Funktion durchstöbern und schauen ob er dort fündig wird.

 

Diese Artikel könnten dich auch interessieren

1. PHP Design Patterns: Das Registry Pattern » 02. Januar 2012
2. Ausnahmebehandlung mit PHP » 01. Januar 2012
3. Optimierung des Blogs mit PHP » 18. April 2011
4. Meine PHP Templateklasse. » 18. Oktober 2010

Diesen Beitrag teilen

Twitter Facebook Delicious Digg Bei allen Services (Mister Wong, Yigg, Infopirat etc.)

  1. 9 Kommentare zum Beitrag.

  2. 1. von Andre am 05. Mai 2011 um 09:59:07 Uhr.

    Klasse.

    Aber wie machst Du das hier in deiner Blog-Version 1 ?
    Hier steht doch auch schon : "vor 21 Tagen" !

    Ist die neue Variante so viel besser?

  3. 2. von Rainer Schulz am 05. Mai 2011 um 13:06:58 Uhr.

    Hallo Andre,

    ich benutze in der Blogversion 1 die erste Stufe dieser Funktion, die ich geschrieben habe. Diese Stufe der Funktion ist nur minimal anders, da hier zum Beispiel keine Anzeige mit "Wochen" erscheint.

    LG Rainer

  4. 3. von Toni am 05. Mai 2011 um 14:09:48 Uhr.

    so hier mal die Funktion etwas kürzer und anders :D

    function getSince( $timestamp ) {
       if ( !is_numeric( $timestamp ) ) {
           return null;
       }
       
       $away  = time() - $timestamp;
       $since = 'vor Ewigkeiten';
       $times = array( array( 60, 'Sekunde', 'n', $away ),
                       array( 3600, 'Minute', 'n', floor( $away / 60 ) ),
                       array( 86400, 'Stunde', 'n', floor( $away / 3600 ) ),
                       array( 604800, 'Tag', 'en', floor( $away / 86400 ) ),
                       array( 2592000, 'Woche', 'n', floor( $away / 604800 ) ),
                       array( 31104000, 'Monat', 'en', floor( $away / 2592000 ) ),
                       array( 155520000, 'Jahr', 'en', floor( $away / 31104000 ) )
                      );
       for ( $i = 0; $i < sizeof( $times ); ++$i ) {
           if ( $away < $times[$i][0] ) {
               $since = 'vor ' . $times[$i][3] . ' ' . $times[$i][1] .
                           ( $times[$i][3] == 1 ? '' : $times[$i][2] );
               break;
           }
       }

       return $since;
    }

  5. 4. von Rainer Schulz am 05. Mai 2011 um 15:45:51 Uhr.

    Hallo Toni,

    danke für deine Bemühungen. Ich habe auch schon überlegt, das in dieser Form zu machen, fand das aber zu aufwendig und rechenintensiv für diese kleine Funktion.

    Ich habe mal einen Benchmark mit unseren beiden Funktionen durchgeführt:
    Parameter des Benchmarks:
       - 100 Durchläufe mit je 1000 Berechnungen
       - immer der Selbe Zeitstempel

    Das Ergebnis meiner (Rainer) Funktion:
       - durchschnittlich 0.001668758392334 Sekunden für 1000 Berechnungen

    Das Ergebnis deiner (Toni) Funktion:
       - durchschnittlich 0.017800533771515 Sekunden für 1000 Berechnungen

    Daraus lässt sich ableiten, dass meine Funktion um den Faktor 10 schneller ist. :P

    Mir ist klar, dass der Unterschied marginal ist, aber er ist Messbar!

    LG Rainer

  6. 5. von Rainer Schulz am 05. Mai 2011 um 15:51:27 Uhr.

    Wobei die Prüfung, ob es sich um einen numerischen Wert handelt, am Anfang schon Sinn macht.

    Ich werde diesen Mangel sofort beheben!

    LG

  7. 6. von Andre am 05. Mai 2011 um 15:52:50 Uhr.

    Tja, was ist schon der faktor 10.

    1000 kg statt 100kg  :-)

    oder

    100km/h statt 10 km/h  :-)

    Auch alles meß- und fühlbar....

    ASC

  8. 7. von pManuel am 15. Mai 2011 um 23:46:40 Uhr.

    Erstmals Vielen dank an Rainer und Toni für die Mühe. Ich finde gut, dass die Version von Rainer eher für PHP Anfänger ist, und Toni's schon für fortgeschritene Programmieren. Also ist für jeden etwas dabei :)

    Lg Manu

  9. 8. von Christian am 16. Juni 2011 um 16:15:18 Uhr.

    Ab PHP5.3:

    http://www.php.net/manual/en/datetime.diff.php
    Bei den Beispielen ganz unten, der Eintrag von Umair Ashraf. Arbeitet zwar mit DateTime-Objekten, sollte jedoch kein Problem sein, einen timestamp umzuwandeln.

  10. 9. von Rainer Schulz am 16. Juni 2011 um 18:46:48 Uhr.

    Danke Christian,

    ich werde mir das bei Gelegenheit mal anschauen und testen wie die Geschwindigkeit bei dieser Methode ist.

  11. Schreib einen Kommentar.
  12. Kommentare sind deaktiviert.