95 votes

Obtenir l'intervalle des secondes entre deux dates en PHP ?

2009-10-05 18:11:08

2009-10-05 18:07:13

Cela devrait générer 235, comment faire ?

173voto

JCM Points 1259

Avec les objets DateTime, vous pouvez procéder comme suit :

$date = new DateTime( '2009-10-05 18:07:13' );
$date2 = new DateTime( '2009-10-05 18:11:08' );

$diffInSeconds = $date2->getTimestamp() - $date->getTimestamp();

162voto

Paul Dixon Points 122033

Vous pouvez utiliser strtotime() pour le faire :

$diff = strtotime('2009-10-05 18:11:08') - strtotime('2009-10-05 18:07:13')

Une approche similaire est possible avec les objets DateTime, par exemple.

$date = new DateTime( '2009-10-05 18:07:13' );
$date2 = new DateTime( '2009-10-05 18:11:08' );

$diff = $date2->getTimestamp() - $date->getTimestamp();

9voto

Andi Points 5222

La référence PHP à la date et à l'heure est utile pour ce genre de choses : Fonctions PHP Date et Heure

strtotime() est probablement le meilleur moyen.

$seconds = strtotime('2009-10-05 18:11:08') - strtotime('2009-10-05 18:07:13')

7voto

designcise Points 358

Pour ceux qui s'inquiètent des limites de l'utilisation des horodateurs (c'est-à-dire l'utilisation de dates antérieures à 1970 et postérieures à 2038), vous pouvez simplement calculer la différence en secondes comme suit :

$start = new DateTime('2009-10-05 18:11:08');
$end = new DateTime('2009-10-05 18:07:13');
$diff = $end->diff($start);

$daysInSecs = $diff->format('%r%a') * 24 * 60 * 60;
$hoursInSecs = $diff->h * 60 * 60;
$minsInSecs = $diff->i * 60;

$seconds = $daysInSecs + $hoursInSecs + $minsInSecs + $diff->s;

echo $seconds; // output: 235

Il a écrit un article de blog pour ceux qui souhaitent en savoir plus.

6voto

MilkThief Points 11

En raison des limitations d'époque d'Unix, vous pourriez avoir des problèmes pour comparer des dates avant 1970 et après 2038. J'ai choisi de perdre la précision (=ne pas regarder la seconde) mais d'éviter de passer par les conversions d'époques unix (getTimestamp). Cela dépend de ce que vous voulez faire...

Dans mon cas, l'utilisation de 365 au lieu de (12*30) et de "30" comme durée moyenne du mois, a réduit l'erreur dans une sortie utilisable.

function DateIntervalToSec($start,$end){ // as datetime object returns difference in seconds
    $diff = $end->diff($start);
    $diff_sec = $diff->format('%r').( // prepend the sign - if negative, change it to R if you want the +, too
                ($diff->s)+ // seconds (no errors)
                (60*($diff->i))+ // minutes (no errors)
                (60*60*($diff->h))+ // hours (no errors)
                (24*60*60*($diff->d))+ // days (no errors)
                (30*24*60*60*($diff->m))+ // months (???)
                (365*24*60*60*($diff->y)) // years (???)
                );
    return $diff_sec;
}

Notez que l'erreur pourrait être 0, si les quantités "moyennes" sont destinées à la différence. La documentation PHP ne parle pas de cela... Dans un mauvais cas, l'erreur pourrait être :

  • 0 seconde si la différence est appliquée aux intervalles de temps < 1 mois
  • 0 à 3 jours si le diff est appliqué à des intervalles de temps > 1 mois
  • 0 à 14 jours si le diff est appliqué à des intervalles de temps > 1 an

Je préfère supposer que quelqu'un a décidé de considérer "m" comme 30 jours et "y" comme 365, en chargeant "d" de la différence lorsque "diff" passe par des mois sans 30 jours...

Si quelqu'un en sait plus sur ce sujet et peut fournir une documentation officielle, il est le bienvenu !

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