Code Snippet: PHP Funktion Sekunden in Zeitformat

Bei meinem derzeitigen Web-App-Projekt kommt unteranderem eine Funktion zum Einsatz, die einen Wert in Sekunden in eine gut lesbare Zeit-Ausgabe umwandelt um bspw. eine Wartezeit für den Benutzer gut lesbar auszugeben. Natürlich gibt es bereits viele Methoden und Beispiele im Netz und auch die nativen PHP Funktionen wie etwa gmdate() sind durchaus nutzbar. Oft aber ist weder die Ausgabe der Formate noch die Abhandlung der Werte dynamisch, so werden leere Zeitwerte meist mit NULL ausgegeben oder falsch dargestellt.

41477212 Sekunden entsprechend nach Ausgabe durch die Funktion – 1 Jahr 115 Tage 1 Stunde 26 Minuten. Auf die Umwandlung zu Monaten und Wochen wurde bei der Ausgabe zwecks Lesbarkeit verzichtet.

Um also die dynamische Formatierung sowie Ausgabe des Wertes in ein Zeitformat zu erreichen, bietet folgende Funktion eine hilfreichen Rahmen.

// IT-Feed Return time value function
function getTimeValue($TimeValue, $text) {
    $minuteInSeconds = 60;
    $hourInSeconds = 60 * 60;
    $dayInSeconds = 60 * 60 * 24;
    $yearInSeconds = 60 * 60 * 24 * 365; // in case of 365 days

    $years = floor($TimeValue / $yearInSeconds);
    $days = floor(($TimeValue % $yearInSeconds) / $dayInSeconds);
    $hours = floor(($TimeValue % $dayInSeconds) / $hourInSeconds);
    $minutes = floor(($TimeValue % $hourInSeconds) / $minuteInSeconds);
    $seconds = $TimeValue % $minuteInSeconds;

    //define time labels based on the value
    $years_label = ($years == 1) ? $text['year'] : $text['years'];
    $days_label = ($days == 1) ? $text['day'] : $text['days'];
    $hours_label = ($hours == 1) ? $text['hour'] : $text['hours'];
    $minutes_label = ($minutes == 1) ? $text['minute'] : $text['minutes'];
    $seconds_label = ($seconds == 1) ? $text['second'] : $text['seconds'];

    //calculate and define info text based on the seconds count
    switch(true) {
        case ($TimeValue < 1):
            $TimeValueOutput = sprintf("0 $seconds_label", $TimeValue);
            break;
        case ($TimeValue == 1):
            $TimeValueOutput = sprintf("%d $seconds_label", $TimeValue);
            break;
        case ($TimeValue > 1 && $TimeValue < $minuteInSeconds):
            $TimeValueOutput = sprintf("%d $seconds_label", $TimeValue);
            break;
        case ($TimeValue == $minuteInSeconds):
            $TimeValueOutput = sprintf("%d $minutes_label", $minutes);
            break;
        case ($TimeValue > $minuteInSeconds && $TimeValue < $hourInSeconds):
            $TimeValueOutput = sprintf("%d $minutes_label %d $seconds_label", $minutes, $seconds);
            break;
        case ($TimeValue == $hourInSeconds):
            $TimeValueOutput = sprintf("%d $hours_label", $hours);
            break;
        case ($TimeValue > $hourInSeconds && $TimeValue < $dayInSeconds):
            $TimeValueOutput = sprintf("%d $hours_label %d $minutes_label", $hours, $minutes);
            break;
        case ($TimeValue >= $dayInSeconds && $TimeValue < $yearInSeconds):
            $TimeValueOutput = sprintf("%d $days_label %d $hours_label %d $minutes_label", $days, $hours, $minutes);
            break;
        case ($TimeValue >= $yearInSeconds):
            $TimeValueOutput = sprintf("%d $years_label %d $days_label %d $hours_label %d $minutes_label", $years, $days, $hours, $minutes);
            break;
    }

    return $TimeValueOutput;
}

In der Funktion wird ein Array $text aufgerufen, welches vor Nutzung natürlich mit entsprechenden Werten verfügbar sein sollte. In meinem Fall dient dies der Möglichkeit eine Mehrsprachigkeit zu integrieren. Ein entsprechendes Array könnte wie folgt aussehen:

// Text labels for time values
$text = array(
    'second' => 'Sekunde',
    'seconds' => 'Sekunden',
    'minute' => 'Minute',
    'minutes' => 'Minuten',
    'hour' => 'Stunde',
    'hours' => 'Stunden',
    'day' => 'Tag',
    'days' => 'Tage',
    'year' => 'Jahr',
    'years' => 'Jahre'
);

Leon Gawinski

System Engineer Softwarebereich Microsoft

Empfohlene Beiträge

Schreibe einen Kommentar

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

Empfehlungen
Schließen
Schaltfläche "Zurück zum Anfang"