106 votes

Calcul du 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 du genre :

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

Toutefois, le days de l'objet DateInterval semble ne pas fonctionner dans la version actuelle de PHP5.3 (au moins sous Windows, elle renvoie toujours le même résultat que la propriété 6015 valeur). J'ai également essayé de le faire de manière à ne pas préserver le nombre de jours de chaque mois (arrondi à 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 heureux d'utiliser cette solution de fortune.

0 votes

Quel est le résultat de $delta->format("%r%s") ?

1 votes

@warrenm Le problème avec format c'est quand on dit que le nombre de secondes est 0 alors que le nombre de minutes est 1, $delta->format("%r%s") s'avère être 0 :(

4 votes

Pire encore, je parle en tant que personne qui corrige actuellement un défaut détecté lors de la revue de code d'un codeur qui a collé votre code EXACT ci-dessus - tous les mois n'ont pas 30 jours, et toutes les années n'ont pas 365 jours. :) (Edit : et ce codeur peut être moi-même !)

229voto

Ben Points 9182

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

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

12 votes

Je suppose que je n'ai pas RTFM... C'est ce que je cherchais ; merci beaucoup !

3 votes

+1 : agréable et propre ! A noter que getTimestamp() est disponible en PHP >= 5.3.0.

1 votes

Je pense que cela fonctionne sans cas limite (je ne parierais pas ma vie là-dessus, car je viens de passer 10 mois à refactoriser DateTime d'une grosse application PHP), mais il faut noter que c'est une solution de contournement qui ne résout pas le problème de la comparaison des dates-intervalles. Ce serait quand même très bien d'avoir cette possibilité.

37voto

dave1010 Points 6595

Cette fonction vous permet d'obtenir la durée totale en secondes à partir 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();
}

2 votes

Il est à noter que DateTimeImmutable n'est disponible qu'à partir de PHP 5.5 ou plus.

0 votes

Je pense que vous devez remplacer les variables de retour $endTime y $reference l'un avec l'autre, puisque cela me donne un résultat négatif avec une valeur de date à intervalle future.

0 votes

Je ne pense pas que Timestamp soit en secondes non plus. PHP DateTime = Horrible API

4voto

xil3 Points 7220

Vous pourriez le faire comme ça :

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

$differenceInSeconds = $currentTime - $timeInPast;

time() renvoie le temps actuel en secondes depuis l'époque (1970-01-01T00:00:00), et strtotime fait la même chose, mais en se basant sur une date/heure spécifique que vous donnez.

4voto

hoofuz Points 9
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;
}

-8voto

Duniyadnd Points 2542

Vous pourriez simplement indiquer les chiffres exacts (au lieu de 60*60, mettez 3600) afin qu'il n'ait pas besoin de les calculer à chaque fois.

Edit - j'ai corrigé le nombre en fonction de votre commentaire.

0 votes

Ce serait bien, et cela s'exécuterait probablement une fraction de seconde plus vite en PHP, mais cela me laisse toujours avec la même erreur de calcul que dans l'exemple ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X