2013-01-11 14 views

Odpowiedz

22

Istnieje funkcja format do tego. Ale nie zwróci liczby sekund. Aby uzyskać liczbę sekund, by użyć tej metody

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

Jeśli naprawdę chcesz używać $interval potrzebne do jego obliczenia.

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

Tutaj

  • 86400 jest liczbą sekund w dniu
  • 3600 jest liczbą sekund godzinę
  • 60 jest w sekundach na minutę
+0

powraca '0 sekund' – sanchitkhanna26

+0

@MarkBaker tak, to dlatego zmieniono moją odpowiedź –

+0

Świetnie! Mam to działa. Dziękujemy @shiplu – sanchitkhanna26

35

Innym sposobem uzyskania liczby sekund w interwale i s, aby dodać go do dnia zerowego i uzyskać znacznik czasowy tym dniu:

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

Ta metoda będzie obsługiwać przedziały utworzone przez contructor DateInterval mniej lub bardziej poprawnie, natomiast shiplu's answer zignoruje lat, miesięcy i dni dla takich interwały. Odpowiedź shiplu jest jednak dokładniejsza w przypadku interwałów, które zostały utworzone przez odjęcie dwóch dat. W przypadku interwałów składających się tylko z godzin, minut i sekund obie metody uzyskają poprawną odpowiedź.

+0

@Brilliand Dlaczego to rozwiązanie jest mniej dokładne dla odstępów czasu, które zostały utworzone przez odjęcie dwóch dat? Nie rozumiem jak. Możesz wytłumaczyć ? – MaxiWheat

+3

@MaxiWheat Powiedz, że przedział czasu został utworzony przez odjęcie 2015-02-01 od 2015-03-01. To różnica jednego miesiąca, która wynosi 28 dni. Metoda Shiplu potraktuje to jako 28-dniową przerwę, podczas gdy moja metoda potraktuje ją jako interwał jednomiesięczny, arbitralnie wybierze styczeń jako miesiąc i wytworzy znacznik czasu na podstawie 31 dni w styczniu. – Brilliand

2

Dodam tylko 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; 
} 

Aby obsłużyć ujemnych interwały.

Należy pamiętać, że - w przeciwieństwie do Brilliand's answer - Powyższy kod rozpatrzy prawidłowo lata, miesiące i daty. Ponieważ $ interval-> days jest wartością bezwzględną ($ interval-> d jest zależne od miesiąca).

EDIT: ta funkcja jest nadal nie skorygować, jak wskazano przez @Brilliand. Przykład ten to

new DateInterval('P4M3DT2H'); 

Nie radzi sobie dobrze z miesiącami.

+0

Przykładem przedziału, w którym to wystąpi, jest 'new DateInterval ('P4M3DT2H')'. Wypróbuj i zobacz - zmienna 'days' jest pusta, pomimo przedziału obejmującego w przybliżeniu 123 dni. – Brilliand

+0

W przyszłości, jeśli masz zamiar mnie oskarżyć o bycie złym, proszę, abyś to zrobił w komentarzu do mojej odpowiedzi. Długo to zauważyłem. – Brilliand

+0

@Brilliand, masz rację. Odpowiednio zredagowałem swoją odpowiedź. –

Powiązane problemy