PHP-Tipps: Relative Zeitangaben

Man kennt es ja beispielsweise von Last.FM:

Du gehst vielleicht zu The Subways in HsD. vor 30 Tagen

Gerade bei kurz zurückliegenden Zeitangaben ist es sinnvoll, das Datum relativ anzugeben (vor x Tagen/Wochen/Monaten), vor allem dann, wenn eine genaue Angabe nicht erforderlich ist – denn eine relative Zeitangabe lässt Menschen leichter erkennen, wann das Ereignis passiert ist.
Eine solche relative Zeitangabe mit PHP zu erstellen ist garnicht so schwer. Es muss lediglich der Unterschied zwischen dem anzugebenden Zeitpunkt und dem aktuellen Datum berechnet werden. Je nach Größe des Unterschiedes wird dann die Zeitangabe in Minuten, Stunden oder Tagen angegeben. Bei länger zurückliegenden Zeitpunkten wird nur noch der Monat und das Jahr angezeigt. Es besteht natürlich die Möglichkeit, per HTML-Attribut title (Hover für Beispiel) das tatsächliche Datum anzeigen zu lassen.
Also, auf gehts:

function getRelativeDate ($ts)
{
    $now = time ();
 
    // Zeitabstand berechnen
    $diff['sec'] = abs ($now - $ts);
    $diff['min'] = floor ($diff['sec'] / 60);
    $diff['hour'] = floor ($diff['min'] / 60);
    $diff['days'] = floor ($diff['hour'] / 24);
 
    // Zukunft
    if ($ts > $now) {
 
        // In weniger als einer Stunde
        if ($diff['min'] < 60) {
            return sprintf ('In %d Minute(n)', $diff['min']);
 
        // In weniger als einem Tag
        } elseif ($diff['hour'] < 24) {
            return sprintf ('In %d Stunde(n)', $diff['hour']);
 
        // In diesem Monat
        } elseif ($diff['days'] < 32) {
            return sprintf ('In %d Tag(en)', $diff['min']);
        }
 
    // Vergangenheit
    } else {
 
        // Bei weniger als 5 Minuten Differenz
        // keine Zeitangabe machen
        if ($diff['min'] < 5) {
            return 'Gerade eben';
 
        // Vor weniger als einer Stunde
        } elseif ($diff['min'] < 60) {
            return sprintf ('Vor %d Minute(n)', $diff['min']);
 
        // Vor weniger als einem Tag
        } elseif ($diff['hour'] < 24) {
            return sprintf ('Vor %d Stunde(n)', $diff['hour']);
 
        // Vor weniger als einem Monat
        } elseif ($diff['days'] < 32) {
            return sprintf ('Vor %d Tag(en)', $diff['days']);
        }
    }
 
    // Differenz über einem Monat:
    // Zeige Monat und Jahr des Ereignisses
    return strftime ('%B %Y', $ts);
}

Die Verwendung ist denkbar einfach: Lediglich den Timestamp (z.B. aus einer Datenbank o.ä.) übergeben und die gewünschte Formatierung wird zurückgegeben. Natürlich ist es möglich, das Plural-n dynamisch anzuhängen, hier beispielsweise für die Minutenangabe:

return 'Vor ' . $diff['min'] . ' Minute' . ($diff['min'] != 1) ? 'n' : '';

Diese Möglichkeit wurde zur Vereinfachung im Skript weggelassen. Die Funktion funktioniert sowohl für kommende als auch für vergangene Zeiten. Einige Beispiele:

// Vor 2 Minuten: Ausgabe "Gerade eben"
$ts = time() - 2 * 60;
echo getRelativeDate($ts);
 
// Vor 6 Minuten: Ausgabe "Vor 6 Minute(n)"
$ts = time() - 6 * 60;
echo getRelativeDate($ts);
 
// In einer Stunde: Ausgabe "In 1 Stunde(n)"
$ts = time() + 60 * 60;
echo getRelativeDate($ts);

Hinweis: Um deutsche Monatsnamen zu erhalten muss u.U. die Sprache für strftime zuerst auf Deutsch gestellt werden. Dazu muss auch eine deutsche Sprache installiert sein!

setlocale(LC_TIME, 'de_DE@euro', 'de_DE', 'de', 'ge');

Kommentare & Trackbacks (0)

keine Kommentare

Jetzt kommentieren

Erlaubte HTML-Tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">





 

Kategorien

 

Der Kau: Der Link führt übrigens zu einem “Test”. Allerdings erwähnt schon die Einleitung die...

Der Kau: Der Datenschutz ist nach der Rechtsprechung des Bundesverfassungsgerichts ein Grundrecht (Recht auf...

Benny: Und wieder seh ich eigentlich kein Problem dahinter? Solange hier nur firmenintern die Mails überwacht werden...

Der Kau: Mit der Demokratie gehts schon seit Jahren bergab… Die großen / mächtigen Staaten sind inzwischen so...

Steffen: Das stimmt, aber die Grundproblematik bleibt ja dennoch bestehen. Wenn der Staat immer mehr Schulden...

 

Blogroll