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.
Ne pourriez-vous pas comparer les horodatages à la place?
$now = new DateTime('now');
$diff = $date->getTimestamp() - $now->getTimestamp()
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();
}
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.
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;
}