Lorsque nous travaillons avec la date et l'heure en PHP, nous devons souvent effectuer des calculs impliquant des intervalles de dates. PHP fournit la classe DateInterval pour représenter les durées. Cependant, l'ajout de deux objets DateInterval n'est pas simple.
Le problème se pose car PHP ne prend pas en charge la surcharge d'opérateurs pour les objets. Par conséquent, l'utilisation de l'opérateur avec des objets DateInterval tente de les convertir en chaînes, ce qui n'est pas pris en charge. Cela entraîne un comportement inattendu et des calculs incorrects.
Pour ajouter deux objets DateInterval, nous pouvons utiliser l'approche suivante :
Voici un exemple complet :
<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>
Cette solution crée un nouvel objet DateTime $e et le définit sur minuit (00:00). Ensuite, il ajoute les premier et deuxième objets DateInterval ($interval1 et $interval2) à $e à l'aide de la méthode add. Enfin, il calcule la différence entre le point de référence d'origine ($f, qui est également minuit) et le $e mis à jour pour obtenir la durée totale.
Pour des scénarios plus complexes, nous pouvons étendre la classe DateInterval pour définir notre propre comportement d'ajout d'objets DateInterval. Cela nous permet de stocker les durées dans un format plus pratique et d'effectuer des calculs plus efficacement.
Voici un exemple de classe étendue :
<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>
Dans cet exemple, la classe MyDateInterval étend DateInterval et remplace la méthode add pour accumuler les durées de chaque composant (années, mois, jours, heures, minutes et secondes). En utilisant cette classe étendue, nous pouvons ajouter des objets DateInterval plus efficacement et plus facilement.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!