2013-01-11 11 views

Antwort

22

Es gibt eine Funktion format dafür. Aber es wird nicht die Anzahl der Sekunden zurückgeben. Um wie viele Sekunden verwenden Sie diese Technik

$seconds = abs($datetime1->getTimestamp()-$datetime2->getTimestamp()); 

Wenn Sie wirklich verwenden möchten $interval Sie müssen es berechnen.

$seconds = $interval->days*86400 + $interval->h*3600 
      + $interval->i*60 + $interval->s; 

Hier

  • 86400 ist die Anzahl der Sekunden eines Tages
  • 3600 die Anzahl der Sekunden in einer Stunde ist
  • 60 die Anzahl der Sekunden in einer Minute ist
+0

es gibt 0 Sekunden zurück – sanchitkhanna26

+0

@MarkBaker ja, deshalb habe ich meine Antwort geändert –

+0

Großartig! Ich habe das funktioniert. Danke @shiplu – sanchitkhanna26

35

Eine andere Möglichkeit, um die Anzahl der Sekunden in einem Intervall zu erhalten s es zum Null Datum hinzuzufügen, und erhalten den Zeitstempel dieses Datums:

$seconds = date_create('@0')->add($interval)->getTimestamp(); 

Diese Methode wird Intervalle über die DateInterval contructor erstellt Griff mehr oder weniger korrekt, während shiplu's answer wird Jahre ignorieren, Monate und Tage für einen solchen Intervalle. Die Antwort von shiplu ist jedoch genauer für Intervalle, die durch Subtraktion von zwei Daten erstellt wurden. Bei Intervallen, die nur aus Stunden, Minuten und Sekunden bestehen, erhalten beide Methoden die richtige Antwort.

+0

@Brilliand Warum ist diese Lösung für Intervalle, die durch Subtrahieren von zwei Daten erstellt wurden, weniger genau? Ich verstehe nicht wie. Können Sie erklären ? – MaxiWheat

+3

@MaxiWheat Angenommen, das Zeitintervall wurde durch Subtraktion 2015-02-01 vom 01.03.2015 erstellt. Das ist ein Unterschied von einem Monat, was 28 Tagen entspricht. Shiplus Methode wird dies als ein 28-tägiges Intervall behandeln, während meine Methode es als ein einmonatiges Intervall behandelt, willkürlich den Januar als den Monat wählt und einen Zeitstempel basierend auf den 31 Tagen im Januar erstellt. – Brilliand

2

möchte ich hinzufügen, nur shiplu's answer:

function dateIntervalToSeconds($interval) 
{ 
    $seconds = $interval->days*86400 + $interval->h*3600 
     + $interval->i*60 + $interval->s; 
    return $interval->invert == 1 ? $seconds*(-1) : $seconds; 
} 

negativen Abständen zu behandeln.

Beachten Sie, dass - im Gegensatz zu Brilliand's answer - Der obige Code berücksichtigt Jahre, Monate und Daten korrekt. Weil $ interval-> days ein absoluter Wert ist ($ interval -> d ist relativ zum Monat).

EDIT: diese Funktion ist noch nicht korrigieren, wie durch @Brilliand hingewiesen. Ein Gegenbeispiel ist

new DateInterval('P4M3DT2H'); 

Es behandelt Monate nicht gut.

+0

Ein Beispiel für ein Intervall, bei dem dies fehlschlägt, ist 'new DateInterval ('P4M3DT2H')'. Probieren Sie es aus und sehen Sie - die 'days' Variable ist leer, obwohl das Intervall ungefähr 123 Tage umfasst. – Brilliand

+0

Wenn Sie mir in der Zukunft vorwerfen wollen, dass ich mich geirrt habe, bitte ich Sie, dies in einem Kommentar zu meiner Antwort zu tun. Es hat lange gedauert, das zu bemerken. – Brilliand

+0

@Brilliand, Sie haben Recht. Ich habe meine Antwort entsprechend bearbeitet. –