2009-10-05 18:11:08
2009-10-05 18:07:13
Cela devrait générer 235, comment faire?
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();
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();
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')
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:
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!
strtotime("2009-10-05 18:11:08") - strtotime("2009-10-05 18:07:13")
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());