Dauer mit Carbon in Stunden und Minuten ausgeben

Laravel bietet mit Carbon eine mächtige Bibliothek, um mit Zeiten und Datumfsformaten aller Art zu agieren. Ich stand vor Kurzem vor dem Problem, dass ich Zeiten in Minuten erfasse, diese aber gerne in Stunden und Minuten ausgeben möchte.

Natürlich könnte ich dafür mit wenig Aufwand eine eigene Funktion bauen, mich hat hingegen interessiert, wie sich das Problem mit Carbon lösen lässt.

Die Lösung heißt hier CarbonInterval.

Über folgenden Befehl erzeugt man ein CarbonInverval auf Basis von Minuten:

CarbonInterval::minutes($minutes);

Diese Codezeile gibt jetzt allerdings auch einfach nur die Anzahl der Minuten aus – wir haben also nichts gewonnen.

Um die Anzahl Minuten in „sinnvollere Größen“, also Jahre, Monate, Wochen, Tage, Stunden und Minuten umzuwandeln, bietet Carbon die cascade()-Funktion.

CarbonInterval::minutes($minutes)->cascade();

Da ich das Ergebnis jedoch im Format Stunden und Minuten benötigt habe, mussten die größeren Einheiten wie Tage, Wochen, Monate und Jahre verschwinden.

Glücklicherweise lässt sich CarbonInterval konfigurieren:

CarbonInterval::setCascadeFactors([
    'minute' => [60, 'seconds'],
    'hour' => [60, 'minutes'],
]);

Oben genanntes Codebeispiel konfiguriert nur Stunden und Minuten – größere Einheiten sind entfernt. Dadurch erfolgt die Ausgabe von cascade() jetzt nur noch in den Einheiten Stunden und Minuten – Ziel erreicht!

Naja, fast, denn die Konfiguration erfolgt global. Alle folgenden genutzten CarbonInterval geben jetzt auch nur noch Stunden und Minuten aus. Um das zu beheben speichern wir die ursprüngliche Konfiguration, setzen den gewünschten Wert, erzeugen die Ausgabe und stellen die ursprüngliche Konfiguration wieder her:

$cascades = CarbonInterval::getCascadeFactors(); // save initial factors
CarbonInterval::setCascadeFactors([
    'minute' => [60, 'seconds'],
    'hour' => [60, 'minutes'],
]);

$output = CarbonInterval::minutes($minutes)->cascade();
CarbonInterval::setCascadeFactors($cascades); // restore original factors

Nun erhalten wir das gewünschte Ergebnis: $minutes wird nun in Stunden und Minuten ausgeben, ohne CarbonInterval global zu beeinflussen.

Schreibe einen Kommentar