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);
$startist "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 $startund 2 Stunden $end.
Denken Sie daran, dass getTimestampimmer 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");