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.