web-dev-qa-db-fra.com

Calculez le nombre total de secondes en PHP DateInterval

Quelle est la meilleure façon de calculer le nombre total de secondes entre deux dates? Jusqu'à présent, j'ai essayé quelque chose dans le sens de:

$delta   = $date->diff(new DateTime('now'));
$seconds = $delta->days * 60 * 60 * 24;

Cependant, la propriété days de l'objet DateInterval semble être rompue dans la version PHP5.3 actuelle (au moins sous Windows, elle renvoie toujours la même 6015 valeur). J'ai également essayé de le faire d'une manière qui ne permettrait pas de conserver le nombre de jours dans chaque mois (arrondis à 30), les années bissextiles, etc.:

$seconds = ($delta->s)
         + ($delta->i * 60)
         + ($delta->h * 60 * 60)
         + ($delta->d * 60 * 60 * 24)
         + ($delta->m * 60 * 60 * 24 * 30)
         + ($delta->y * 60 * 60 * 24 * 365);

Mais je ne suis vraiment pas content d'utiliser cette solution à demi-cul.

91
efritz

Ne pourriez-vous pas comparer les horodatages à la place?

$now = new DateTime('now');
$diff = $date->getTimestamp() - $now->getTimestamp()
187
Ben

Cette fonction vous permet d'obtenir la durée totale en secondes d'un objet DateInterval

/**
 * @param DateInterval $dateInterval
 * @return int seconds
 */
function dateIntervalToSeconds($dateInterval)
{
    $reference = new DateTimeImmutable;
    $endTime = $reference->add($dateInterval);

    return $endTime->getTimestamp() - $reference->getTimestamp();
}
32
dave1010

Vous pouvez le faire comme ceci:

$currentTime = time();
$timeInPast = strtotime("2009-01-01 00:00:00");

$differenceInSeconds = $currentTime - $timeInPast;

time () renvoie l'heure actuelle en secondes depuis l'heure Epoch (1970-01-01T00: 00: 00), et strtotime fait de même, mais en fonction d'une date/heure spécifique que vous donnez.

5
xil3
static function getIntervalUnits($interval, $unit)
{
    // Day
    $total = $interval->format('%a');
    if ($unit == TimeZoneCalc::Days)
        return $total;
    //hour
    $total = ($total * 24) + ($interval->h );
    if ($unit == TimeZoneCalc::Hours)
        return $total;
    //min
    $total = ($total * 60) + ($interval->i );
    if ($unit == TimeZoneCalc::Minutes)
        return $total;  
    //sec
    $total = ($total * 60) + ($interval->s );
    if ($unit == TimeZoneCalc::Seconds)
        return $total;  

    return false;
}
3
hoofuz