Maison  >  Article  >  développement back-end  >  Comment puis-je ajouter deux objets DateInterval en PHP ?

Comment puis-je ajouter deux objets DateInterval en PHP ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-04 05:07:02812parcourir

How can I add two DateInterval objects in PHP?

Comment pouvons-nous ajouter deux intervalles de dates en PHP ?

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.

Solution

Pour ajouter deux objets DateInterval, nous pouvons utiliser l'approche suivante :

  1. Créez un nouvel objet DateTime et définissez-le sur un point de référence (par exemple, minuit).
  2. Ajoutez le premier DateInterval à l'objet DateTime à l'aide de la méthode add.
  3. Ajoutez le deuxième DateInterval à l'objet DateTime à l'aide de la méthode add.
  4. Calculez la différence entre le point de référence d'origine et l'objet DateTime mis à jour pour obtenir la durée totale.

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.

Solution avancée

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn