Alter eines Zeitstempels mit PHP ermitteln

04Mai20119

Rainer Schulz » vor Ewigkeiten am 04. Mai 2011 um 11:33 » 4647 Klicks » 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.

 

Schlagwörter »      

Über den Autor

 

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

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

Kommentare zum Artikel

  • #1 » von Andre » vor Ewigkeiten am 05. Mai 2011 um 09:59

    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?

  • #2 » von Rainer Schulz » vor Ewigkeiten am 05. Mai 2011 um 13:06

    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

  • #3 » von Toni » vor Ewigkeiten am 05. Mai 2011 um 14:09

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

    [CODE]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;
    }[/CODE]

  • #4 » von Rainer Schulz » vor Ewigkeiten am 05. Mai 2011 um 15:45

    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

  • #5 » von Rainer Schulz » vor Ewigkeiten am 05. Mai 2011 um 15:51

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

    Ich werde diesen Mangel sofort beheben!

    LG

  • #6 » von Andre » vor Ewigkeiten am 05. Mai 2011 um 15:52

    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

  • #7 » von pManuel » vor Ewigkeiten am 15. Mai 2011 um 23:46

    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

  • #8 » von Christian » vor Ewigkeiten am 16. Juni 2011 um 16:15

    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.

  • #9 » von Rainer Schulz » vor Ewigkeiten am 16. Juni 2011 um 18:46

    Danke Christian,

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

Kommentar schreiben

markierte (*) Felder sind Pflichtfelder

E-mail wird nicht veröffentlicht

nur "http://" Adressen sind erlaubt