Bei der Arbeit mit Datum und Uhrzeit in PHP müssen wir häufig Berechnungen mit Datumsintervallen durchführen. PHP stellt die DateInterval-Klasse zur Darstellung von Zeitdauern bereit. Das Hinzufügen von zwei DateInterval-Objekten ist jedoch nicht einfach.
Das Problem entsteht, weil PHP das Überladen von Operatoren für Objekte nicht unterstützt. Daher wird bei Verwendung des Operators mit DateInterval-Objekten versucht, diese in Zeichenfolgen zu konvertieren, was nicht unterstützt wird. Dies führt zu unerwartetem Verhalten und falschen Berechnungen.
Um zwei DateInterval-Objekte hinzuzufügen, können wir den folgenden Ansatz verwenden:
Hier ist ein vollständiges Beispiel:
<code class="php">$a = new DateTime('14:25'); $b = new DateTime('17:30'); $interval1 = $a->diff($b); echo "interval 1: " . $interval1->format("%H:%I"); echo "<br />"; $c = new DateTime('08:00'); $d = new DateTime('13:00'); $interval2 = $c->diff($d); echo "interval 2: " . $interval2->format("%H:%I"); echo "<br />"; $e = new DateTime('00:00'); $f = clone $e; $e->add($interval1); $e->add($interval2); echo "Total interval: " . $f->diff($e)->format("%H:%I") . "\n";</code>
Diese Lösung erstellt ein neues DateTime-Objekt $e und setzt es auf Mitternacht (00:00). Anschließend fügt es mithilfe der Add-Methode das erste und das zweite DateInterval-Objekt ($interval1 und $interval2) zu $e hinzu. Schließlich wird die Differenz zwischen dem ursprünglichen Referenzpunkt ($f, der auch Mitternacht ist) und dem aktualisierten $e berechnet, um die Gesamtdauer zu erhalten.
Für komplexere Szenarien: Wir können die DateInterval-Klasse erweitern, um unser eigenes Verhalten für das Hinzufügen von DateInterval-Objekten zu definieren. Dadurch können wir die Dauer in einem bequemeren Format speichern und Berechnungen effizienter durchführen.
Hier ist ein Beispiel einer erweiterten Klasse:
<code class="php">class MyDateInterval extends DateInterval { public static function fromDateInterval(DateInterval $from) { return new MyDateInterval($from->format('P%yY%dDT%hH%iM%sS')); } public function add(DateInterval $interval) { foreach (str_split('ymdhis') as $prop) { $this->$prop += $interval->$prop; } } } $a = new DateTime('14:25'); $b = new DateTime('17:30'); $interval1 = $a->diff($b); echo "interval 1: " . $interval1->format("%H:%I") . "\n"; $c = new DateTime('08:00'); $d = new DateTime('13:00'); $interval2 = $c->diff($d); echo "interval 2: " . $interval2->format("%H:%I") . "\n"; $e = MyDateInterval::fromDateInterval($interval1); $e->add($interval2); echo "Total interval: " . $e->format("%H:%I") . "\n";</code>
In diesem Beispiel erweitert die MyDateInterval-Klasse DateInterval und überschreibt die Add-Methode, um die Dauer für jede Komponente (Jahre, Monate, Tage, Stunden, Minuten und Sekunden) zu akkumulieren. Durch die Verwendung dieser erweiterten Klasse können wir DateInterval-Objekte effizienter und bequemer hinzufügen.
Das obige ist der detaillierte Inhalt vonWie kann ich zwei DateInterval-Objekte in PHP hinzufügen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!