Conversion objet DateInterval en secondes en php

$datetime1 = date_create('2009-10-11');
$datetime2 = date_create('2009-10-13');
$interval = date_diff($datetime1, $datetime2);

Comment puis-je convertir ce qui précède $interval pour les secondes en php

17
demandé sur Shiplu Mokaddim 2013-01-11 15:49:57

3 réponses

Il existe une fonction format pour cela. Mais il ne retournera pas le nombre de secondes. Pour obtenir le nombre de secondes vous utilisez cette technique

$seconds = abs($datetime1->getTimestamp()-$datetime2->getTimestamp());

Si vous voulez vraiment utiliser $interval vous devez le calculer.

$seconds = $interval->days*86400 + $interval->h*3600 
           + $interval->i*60 + $interval->s;

Ici

  • 86400 est le nombre de secondes dans un jour
  • 3600 est le nombre de secondes dans une heure
  • 60 est le nombre de secondes dans une minute
23
répondu Shiplu Mokaddim 2013-01-11 12:05:40

une autre façon d'obtenir le nombre de secondes dans un intervalle est de l'ajouter à la date zéro, et d'obtenir l'horodatage de cette date:

$seconds = date_create('@0')->add($interval)->getTimestamp();

cette méthode gère plus ou moins correctement les intervalles créés via le contructeur DateInterval, alors que réponse de shiplu ne tiendra pas compte des années, des mois et des jours pour de tels intervalles. Toutefois, la réponse de shiplu est plus précise pour les intervalles qui ont été créés en soustrayant deux dates. Pour des intervalles ne comportant que des heures, minutes et secondes, les deux méthodes obtiendront la bonne réponse.

35
répondu Brilliand 2017-05-23 12:24:59

je tiens seulement à ajouter à réponse de shiplu:

function dateIntervalToSeconds($interval)
{
    $seconds = $interval->days*86400 + $interval->h*3600 
       + $interval->i*60 + $interval->s;
    return $interval->invert == 1 ? $seconds*(-1) : $seconds;
}

pour gérer les intervalles négatifs.

notez que-contrairement à réponse de Brilliand - le code ci-dessus tiendra compte correctement des années, des mois et des dates. Parce que $ interval - >days est une valeur absolue ($interval->d est relatif au mois).

EDIT: cette fonction est toujours pas correct, comme le souligne @Brilliand. Un contre-exemple est

new DateInterval('P4M3DT2H'); 

Il ne gère pas les mois.

2
répondu Alvaro Neira 2018-01-04 15:15:45