RSS Feed

Zeitdifferenz in Worten darstellen

14.04.2009 by naden

Php Zeitfunktionen gibt es zwar massenweise, doch möchte man eine Zeitdifferenz in Worten darstellen, so bietet Php dafür leider kein Zeitformat an.

Die Funktion timelag2words() erledigt diese Aufgabe und liefert beim Aufruf folgende Ausgabe:

Aufruf

printf( 'Vor ca. %s', timelag2words( mktime( 1, 2, 3, 12, 32, 1997 ), null, 6 ) );

Ausgabe
Vor ca. 11 Jahren, 3 Monaten, 16 Tagen, 11 Stunden, 53 Minuten, 51 Sekunden

Über den Paramater $granularity lässt sich genau einstellen, welche Zeitkomponenten im Ergebnis enthalten sein sollen. Die Funktion kann alternativ ein unformatiertes Array mit Werten zurückliefern.

Achtung! timelag2words() beachtet keine Schaltjahre und rechnet damit, dass jeder Monat 30 Tage hat. Deshalb macht es Sinn, vor die Ausgabe “ca.” zu schreiben.

/**
 * timelag2words
 *
 * @param timestamp $from      Von Zeitpunkt
 * @param timestamp $to         Bis Zeitfunkt default jetzt
 * @param integer $granularity  Was soll alles angezeigt werden 1-6
 * @param array  $titles           Titel können in anderer Sprach übergeben werden
 * @param string $return          return type, string default, array sonst
 *
 * @return array
 */ 
function timelag2words( $from, $to = null, $granularity = 6, $titles = null, $return = 'string' )
{
  if( is_null( $titles ) )
  {
    $titles = array(
      array( 'Jahr', 'Monat', 'Tag', 'Stunde', 'Minute', 'Sekunde' ),
      array( 'Jahren', 'Monaten', 'Tagen', 'Stunden', 'Minuten', 'Sekunden' )
    );
  }
 
  $time = ( is_null( $to ) ? time() : $to ) - $from;
 
  $result = array();
 
  foreach( array( 31536000, 2592000, 86400, 3600, 60, 1 ) as $index => $delta )
  {
    if( ( $current = intval( $time / $delta ) ) > 0 )
    {
      if( $granularity >= $index + 1 )
      {
        $result[] = $current . ' ' . $titles[ $current == 1 ? 0 : 1 ][ $index ];
      }
      $time -= $current * $delta;
    }
  }
 
  return( $return == 'string' ? implode( ', ', $result ) : $result );
}

Keine Kommentare »

Noch keine Kommentare

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>