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');