Wenn in PHP mit Zeiten (Arbeitszeiten, Dauer irgendwelcher Vorgänge) gearbeitet werden muss wird dafür oft strtotime() oder DateTime bemüht. Die sind dafür eigentlich nicht gedacht, da strtotime immer einen Zeitstempel und das DateTime-Objekt immer einen Zeitpunkt (ein bestimmtes Datum + Zeit) darstellt.
DateInterval sollte eigentlich das Objekt für Zeitintervalle sein, besitzt aber nur einige wenige Methoden mit so einigen Problemen.
Beispiel 1: Formatierung von Sekunden in Stunden:Minuten:Sekunden
Ausgabe: 00:00:2185
Das Ergebnis ist nicht das was man hier erwarten würde. Noch mehr Kopfschütteln verursacht Beispiel 2:
Ausgabe: 05:-63:185.1500000
Die DateTime::diff() Methode liefert dagegen immer ein normalisiertes DateInterval. Das wird von dieser smarten Funktion
ausgenutzt um Abhilfe für die obigen Probleme zu schaffen.
Beispiel 3:
Ausgabe: 00:36:25
Wird für Beispiel 2 die Normalisierung zugefügt, ergibt sich das folgende sinnvolle Resultat:
Ich denke die "Normalisierung" kann auch für DateIntervall einige interssante Anwendungen ermöglichen.
DateInterval sollte eigentlich das Objekt für Zeitintervalle sein, besitzt aber nur einige wenige Methoden mit so einigen Problemen.
Beispiel 1: Formatierung von Sekunden in Stunden:Minuten:Sekunden
PHP-Code:
$dt = DateInterval::createFromDateString('2185 Seconds');
echo $dt->format('%H:%I:%S');
Das Ergebnis ist nicht das was man hier erwarten würde. Noch mehr Kopfschütteln verursacht Beispiel 2:
PHP-Code:
$di = DateInterval::createFromDateString('5 hour -63 Minutes 185 Seconds 1500000 Microseconds');
echo $di->format('%H:%I:%S.%F');
Die DateTime::diff() Methode liefert dagegen immer ein normalisiertes DateInterval. Das wird von dieser smarten Funktion
PHP-Code:
function normalizeDateInterval(DateInterval $interval, $base = "@0")
{
$baseDate = date_create($base);
return $baseDate->diff((clone $baseDate)->add($interval));
}
Beispiel 3:
PHP-Code:
$di = DateInterval::createFromDateString('2185 Seconds');
$di = normalizeDateInterval($di);
echo $di->format('%H:%I:%S');
Wird für Beispiel 2 die Normalisierung zugefügt, ergibt sich das folgende sinnvolle Resultat:
Code:
04:00:06.500000
Kommentar