freeQnet-Logo
freeQnet

Code-Snippet Better Human Time Diff

So langsam aber sicher kommt mein neues Blogdesign voran. Es gibt nur tonnenweise Kleinigkeiten, die doch eine ganze Weile aufhalten. Eine kleine Neuerung im Design will ich aber schon mal mit euch teilen, weil ich denke, dass auch andere von dieser PHP-Funktion für WordPress profitieren können.

Vermutlich hat fast jeder schon mal eine Website gesehen, auf der zu geschriebenen Beiträgen kein vollständiges Datum sondern stattdessen “vor 3 Stunden”, “vor 2 Tagen” oder ähnliche Zeitangaben haben. Eine der bekanntesten Seiten mit dieser Art Zeitangabe ist z.B. Twitter, aber auch WordPress bringt so eine Funktion namens “human_time_diff” mit, die sich für solche Zwecke einsetzen lässt. Diese hat aber für mich drei grobe Haken, die mich dazu bewegten, basierend darauf eine eigene Funktion zu bauen.

Im Englischen funktioniert human_time_diff ganz ordentlich, will man sie allerdings mit deutsch übersetztem Blog verwenden, scheitert man allein schon daran, dass bei mehreren Tagen eben z.B. “2 Tage” statt “2 Tagen” generiert wird, was sich als “vor 2 Tage” nun mal reichlich blöd liest. Wer allerdings wie ich aus Performance-Gründen gar nicht erst mit der auf deutsch übersetzten WordPress-Version arbeitet sondern das Original benutzt, bekommt von der Funktion natürlich erst gar keine deutschen Texte zurückgegeben. Zu guter letzt fehlt der Funktion auch ein Fallback, das nach einigen Tagen einfach auf’s normale Datum wechselt, anstatt irgendwann “vor 1234 Tage” anzuzeigen, was kaum einer zurückrechnen mag.

All das habe ich nun versucht, mit meiner eigenen Version der Funktion zu verbessern. Hier erst mal der Quellcode, den ich bereits zur Erläuterung ausführlich mit Kommentaren ausgestattet habe.

// Funktion zur Anzeige "menschlicher" Zeitangaben mit zwei Parametern, die das Von- und Bis-Datum als Unix-Timestamp aufnehmen.
function german_human_time_diff( $from, $to = '' ) {
  // Ist das Bis-Datum leer, wird angenommen, dass der jetzige Zeitpunkt verwendet werden soll.
  if ( empty($to) )
    $to = current_time('timestamp');
 
  // Jetzt ermitteln wir uns die Differenz aus beiden Daten, mit der wir dann weiter arbeiten wollen.
  $diff = (int) abs($to - $from);
 
  // Ist die Differenz kleiner als 3600 Sekunden, wollen wir die Zeit in Minuten ausgeben
  if ($diff <= 3600) {
    // Durch Teilen der Sekunden-Differenz durch 60 ermitteln wir uns die Anzahl der Minuten...
    $mins = round($diff / 60);
 
    // Ist der ermittelte Wert kleiner als 3 Minuten, geben wir ein "gerade eben" zurück! Ansonsten die Anzahl der Minuten
    if ($mins <= 3) {
      $since = 'gerade eben';
    } else {
      // Die Funktion "sprintf" formatiert uns den String, mit der Wordpress-Funktion "_n" switchen wir zwischen Ein- oder Mehrzahl.
      $since = 'vor '.sprintf(_n('%s Minute', '%s Minuten', $mins), $mins);
    }
  }
  // Liegt ein Zeitraum größer als 3600 Sekunden, aber kleiner als 86400 Sekunden vor, geben wir Stunden zurück!
  else if (($diff <= 86400) && ($diff > 3600)) {
    // Diesmal teilen wir die Zeit durch 3600, um auf die Stunden zu kommen!
    $hours = round($diff / 3600);
 
    // Wird aus irgend einem Grund weniger als 1 Stunde ermittelt, setzen wir sie einfach auf 1
    if ($hours <= 1) {
      $hours = 1;
    }
 
    // Wieder wird anhand von sprintf und _n der Text zusammengebaut.
    $since = 'vor '.sprintf(_n('%s Stunde', '%s Stunden', $hours), $hours);
  }
  // Bei einem Zeitraum zwischen 86400 und 432000 (entspricht fünf Tagen) geben wir die Tage zurück!
  else if (($diff <= 432000) && ($diff > 86400)) {
    // Mathefritzen wissen es: Ein Tag hat 86400 Sekunden. Entsprechend teilen wir die Zeit dadurch, um die Anzahl der Tage zu ermitteln!
    $days = round($diff / 86400);
 
    // Wieder fangen wir Werte kleiner 1 ab und setzen sie auf 1
    if ($days <= 1) {
      $days = 1;
    }
 
    // Diesmal wird der Text mit Tagen zusammen gebaut. Man achte darauf, dass wir hier im Gegensatz zur Wordpress-Version direkt "Tagen" schreiben
    $since = 'vor '.sprintf(_n('%s Tag', '%s Tagen', $days), $days);
  }
  // Zu guter letzt kann der Zeitraum nur noch größer als fünf Tage sein. In diesem Fall wollen wir einfach ganz normal das Von-Datum mit Uhrzeit zurückgeben!
  else
    $since = 'am ' . date('d.m.Y',$from) . ' um ' . date('G:i',$from);
 
  // Und nun müssen wir den Text nur noch zurückgeben. Mit "print" statt "return" könnte man ihn auch direkt ins HTML schreiben, wenn man will!
  return $since;
}

Wer sich ein wenig im WordPress-Code auskennt, wird vermutlich erkennen, dass ich die Original-Funktion verwendet und diese nur an einzelnen Stellen angepasst und neu kommentiert habe. Der Großteil der Credits geht hier also natürlich an die WordPress-Entwickler, wobei diese Art Funktion an sich nicht weiter kompliziert zu basteln ist. Meine Änderungen sind neben der Übersetzung auf deutsch und dem Voranstellen von “vor” vor allem die Tatsache, dass ich bei weniger als drei Minuten “gerade eben” und bei mehr als fünf Tagen das komplette Datum ausgebe. Natürlich kann man diese Werte auch auf seine eigenen Bedürfnisse anpassen.

Einzufügen ist der Code einfach in der “functions.php” des verwendeten WordPress-Themes, wobei natürlich drauf zu achten ist, dass man das nicht innerhalb einer schon darin stehenden Funktion tut – also am Besten ganz an den Anfang oder das Ende stellen!

Um die Funktion dann im Theme zu verwenden, ruft man sie einfach an den Stellen auf, an denen man das Datum anzeigen will! Wichtig ist, dass man immer das Von-Datum mitgibt, wie in folgenden Beispielen:

// Aufruf der Funktion im Beitrag selbst, um dessen Veröffentlichungszeit anzugeben:
<?php print german_human_time_diff(get_the_time('U')); ?>
 
// Aufruf der Funktion in den Kommentaren, um die Kommentarzeit anzugeben:
<?php print german_human_time_diff(get_comment_date('U')); ?>

Die Kommentar-Ansicht eines Beitrags im neuen Design. Gut zu erkennen ist hier auch den auch der Einsatz der vorgestellten Funktion!Zu sehen ist davon nun auf meinem alten Theme nichts, auf dem neuen wird das aber stark eingesetzt! Dazu habe ich auch schnell links einen Teaser-Screenshot[1] von der Kommentaransicht für euch! Wie gesagt, es wird langsam! Natürlich freue ich mich wie immer über eure Meinungen, Kritiken und Vorschläge sowohl zur Funktion als auch dem Screenshot!

  1. lässt sich natürlich auf Klick vergrößern! []

Kommentare

1

Das ist ja mal cool. Vielleicht setze ich das bei mir auch mal ein 🙂

geschrieben von Moritz
antworten  •  Link
2

Ist auf jeden Fall echt cool. Werde mal schauen, ob ich das auch mal verwende :).

geschrieben von Lordy
antworten  •  Link
3

Vielen Dank für den Code! Ich habe die Standard-Wordpress-Funktion eben durch Deine ersetzt (und noch ein klein wenig meinen Bedürfnissen angepasst). Bin sehr zufrieden.

geschrieben von Marén
antworten  •  Link
4

@Marén: Freut mich, dass auch meine so alten Beiträge immer noch ihren Nutzen haben 🙂

geschrieben von beetFreeQ
antworten  •  Link
I’ll unlock you immediately. Then we’ll run amok. Or if you’re too tired we’ll walk amok.

Casino Royale (1967)

Blogverzeichnis - Blog Verzeichnis bloggerei.de blogoscoop Bloggeramt.de