2009-10-05 18:11:08
2009-10-05 18:07:13
Dies sollte 235 generieren, wie geht das?
Antworten:
Sie können dazu strtotime () verwenden:
$diff = strtotime('2009-10-05 18:11:08') - strtotime('2009-10-05 18:07:13')
Ein ähnlicher Ansatz ist mit DateTime-Objekten möglich, z
$date = new DateTime( '2009-10-05 18:07:13' );
$date2 = new DateTime( '2009-10-05 18:11:08' );
$diff = $date2->getTimestamp() - $date->getTimestamp();
date()
, um die Datumszeit von jetzt ( date("Y-m-d H:i:s")
) abzurufen .
Mit DateTime-Objekten können Sie dies folgendermaßen tun:
$date = new DateTime( '2009-10-05 18:07:13' );
$date2 = new DateTime( '2009-10-05 18:11:08' );
$diffInSeconds = $date2->getTimestamp() - $date->getTimestamp();
PHP Date Time Referenz ist hilfreich für Dinge wie diese: PHP Date Time Funktionen
strtotime () ist wahrscheinlich der beste Weg.
$seconds = strtotime('2009-10-05 18:11:08') - strtotime('2009-10-05 18:07:13')
Aufgrund von Einschränkungen der Unix-Epoche können Probleme beim Vergleichen von Daten vor 1970 und nach 2038 auftreten. Ich entscheide mich dafür, die Genauigkeit zu verlieren (= nicht auf die einzelne Sekunde schauen), aber es zu vermeiden, Unix-Epochen-Konvertierungen (getTimestamp) zu durchlaufen. Es hängt davon ab, was Sie tun ...
In meinem Fall hat die Verwendung von 365 (12 * 30) und "30" als mittlere Monatslänge den Fehler in einer verwendbaren Ausgabe verringert.
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;
}
Beachten Sie, dass der Fehler 0 sein kann, wenn "mittlere" Mengen für diff vorgesehen sind. Die PHP-Dokumente sprechen nicht darüber ... In einem schlechten Fall könnte ein Fehler sein:
Ich nehme lieber an, dass jemand beschlossen hat, "m" als 30 Tage und "y" als 365 zu betrachten und "d" mit dem Unterschied zu berechnen, wenn "diff" durch Nicht-30-Tage-Monate läuft ...
Wenn jemand etwas mehr darüber weiß und offizielle Unterlagen vorlegen kann, ist er willkommen!
Wenn Sie den tatsächlichen lokalen Zeitunterschied benötigen und damit arbeiten möchten getTimestamp
, müssen Sie die Sommerzeitschalter während des berechneten Zeitraums berücksichtigen. Daher muss der lokale Versatz zu UTC in die Gleichung einbezogen werden.
Nehmen Sie zum Beispiel die folgenden Daten:
$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
ist "2018-02-01 11:00:00" in UTC, während $end
"2018-04-01 10:00:00" in UTC ist. Beachten Sie, dass die Tageszeit in der Berliner Zeitzone zwar gleich ist, in UTC jedoch anders. Der UTC-Offset beträgt eine Stunde $start
und 2 Stunden $end
.
Denken Sie daran, dass getTimestamp
immer UTC zurückgibt! Daher müssen Sie den Versatz vom Zeitstempel abziehen, wenn Sie nach der tatsächlichen lokalen Differenz suchen.
// 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());
Eine einfache und genaue Lösung (als Beispiel für den Kommentar von 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");