2009-10-05 18:11:08
2009-10-05 18:07:13
Cela devrait générer 235, comment faire ?
2009-10-05 18:11:08
2009-10-05 18:07:13
Cela devrait générer 235, comment faire ?
Si vous avez besoin du décalage horaire local réel et souhaitez travailler avec getTimestamp
vous devez tenir compte des commutations DST pendant la période calculée. Par conséquent, le décalage local par rapport à l'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, alors 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
revient toujours à UTC ! Vous devez donc 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());
La solution proposée par @designcise est fausse lorsque la "date de fin" est avant la "date de début". Voici le calcul corrigé
$diff = $start->diff($end);
$daysInSecs = $diff->format('%r%a') * 24 * 60 * 60;
$hoursInSecs = $diff->format('%r%h') * 60 * 60;
$minsInSecs = $diff->format('%r%i') * 60;
$seconds = $daysInSecs + $hoursInSecs + $minsInSecs + $diff->format('%r%s');
Une solution simple et exacte (illustrant le commentaire de Nilz11) :
$hiDate = new DateTime("2310-05-22 08:33:26");
$loDate = new DateTime("1910-11-03 13:00:01");
$diff = $hiDate->diff($loDate);
$secs = ((($diff->format("%a") * 24) + $diff->format("%H")) * 60 +
$diff->format("%i")) * 60 + $diff->format("%s");
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.