web-dev-qa-db-fra.com

Obtenir des secondes d'intervalle entre deux datetime en PHP?

2009-10-05 18:11:08

2009-10-05 18:07:13

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

57
Misier

Vous pouvez utiliser strtotime () pour ce 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 ex.

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

$diff = $date2->getTimestamp() - $date->getTimestamp();
78
Paul Dixon

Avec les objets DateTime, vous pouvez le faire comme ceci:

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

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

La référence PHP Date Time est utile pour des choses comme ceci: PHP Date Time Functions

strtotime () est probablement le meilleur moyen.

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

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

Dans mon cas, utiliser 365 à la place (12 * 30) et "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 des quantités "moyennes" sont destinées à diff. Les documents PHP ne parlent pas de cela ... Dans un mauvais cas, l'erreur pourrait être:

  • 0 seconde si diff est appliqué à des intervalles de temps <1 mois
  • 0 à 3 jours si diff est appliqué à des intervalles de temps> 1 mois
  • 0 à 14 jours si 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 facturant "d" avec la différence lorsque "diff" marche à travers des mois non-30 jours ...

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

4
MilkThief
strtotime("2009-10-05 18:11:08") - strtotime("2009-10-05 18:07:13")
2
jcoder

Si vous avez besoin du vrai décalage horaire local et que vous souhaitez travailler avec getTimestamp, vous devez prendre en compte les commutateurs DST pendant la période calculée. Par conséquent, le décalage local vers UTC doit être inclus dans l'équation.

Prenez, par exemple, les dates suivantes:

$tz = new \DateTimeZone("Europe/Berlin");
$start = new \DateTime("2018-02-01 12:00:00", $tz);
$end = new \DateTime("2018-04-01 12:00:00", $tz);

$start est "2018-02-01 11:00:00" en UTC, tandis que $end est "2018-04-01 10:00:00" en UTC. Notez que, si l'heure est la même dans le fuseau horaire de Berlin, elle est différente en UTC. Le décalage UTC est d'une heure en $start et 2 heures dans $end.

Gardez à l'esprit que getTimestamp renvoie toujours UTC! Par conséquent, vous devez soustraire le décalage de l'horodatage lorsque vous recherchez la différence locale réelle.

// WRONG! returns 5094000, one hour too much due to DST in the local TZ
echo $end->getTimestamp() - $start->getTimestamp();

// CORRECT: returns 5090400
echo ($end->getTimestamp() - $end->getOffset()) - ($start->getTimestamp() - $start->getOffset());
1
lxg