2010-07-04 15 views
71

Jaki jest najlepszy sposób obliczenia całkowitej liczby sekund między dwiema datami? Do tej pory próbowałem coś wzdłuż linii:Oblicz całkowite sekundy w PHP DataInterval

$delta = $date->diff(new DateTime('now')); 
$seconds = $delta->days * 60 * 60 * 24; 

Jednak własność obiektu DateInterval days wydaje się być uszkodzony w obecnej wersji PHP5.3 (przynajmniej na Windows, to zawsze zwraca ta sama wartość 6015). Ja również próbował zrobić to w taki sposób, by nie zachować liczbę dni w każdym miesiącu (do 30 rund), lata przestępne, etc:

$seconds = ($delta->s) 
     + ($delta->i * 60) 
     + ($delta->h * 60 * 60) 
     + ($delta->d * 60 * 60 * 24) 
     + ($delta->m * 60 * 60 * 24 * 30) 
     + ($delta->y * 60 * 60 * 24 * 365); 

Ale ja naprawdę nie jestem zadowolony z korzystania z tego pół- ustalone rozwiązanie.

+0

Co jest wynikiem '$ delta> Format ("% R% s") '? – warrenm

+1

@warrenm Problem z 'format' ma miejsce, gdy mówi się, że liczba sekund wynosi 0, podczas gdy liczba minut wynosi 1, format' $ delta-> ("% r% s") "okazuje się być 0 :( – zapadlo

+3

Gorzej jednak mówienie jak ktoś naprawia teraz usterkę złapaną w przegląd kodu od programisty, który wkleił twój EXACT-y powyżej - nie co miesiąc ma 30 dni, a nie co roku ma 365 dni. :) [Edytuj: i ten koder mógł być sam!] – taiganaut

Odpowiedz

152

Nie można zamiast tego porównać zestawu time stamps?

$now = new DateTime('now'); 
$diff = $date->getTimestamp() - $now->getTimestamp() 
+9

Chyba nie miałem RTFM ... Tego właśnie szukałem; wielkie dzięki! – efritz

+2

+1: ładne i czyste! Zauważ, że metoda 'getTimestamp()' jest dostępna w PHP> = 5.3.0. – Sk8erPeter

+1

Myślę, że działa to bez ukrytych przypadków (nie postawiłbym mojego życia na tym, chociaż właśnie spędziłem 10 miesięcy robiąc refaktor DateTime dużej aplikacji PHP), ale należy zauważyć, że jest to obejście, które nie rozwiązuje porównania -DateIntervals - problem. Wciąż byłoby miło mieć tę umiejętność. – taiganaut

-6

Można po prostu wstawić twarde cyfry (zamiast 60 * 60 - wstawić 3600), więc nie trzeba ich wyliczać za każdym razem.

Edytuj - poprawiono liczbę na podstawie komentarza.

+0

To byłoby w porządku, i prawdopodobnie działałby o ułamek sekundy szybciej w PHP, ale nadal pozostawia mnie z tym samym błędem obliczeń jak w powyższym przykładzie. – efritz

4

Można to zrobić tak:

$currentTime = time(); 
$timeInPast = strtotime("2009-01-01 00:00:00"); 

$differenceInSeconds = $currentTime - $timeInPast; 

czas() zwraca aktualny czas w sekundach od czasu epoki (1970-01-01T00: 00: 00) i strtotime robi to samo, ale na podstawie określonej daty/godziny, którą podasz.

1
static function getIntervalUnits($interval, $unit) 
{ 
    // Day 
    $total = $interval->format('%a'); 
    if ($unit == TimeZoneCalc::Days) 
     return $total; 
    //hour 
    $total = ($total * 24) + ($interval->h); 
    if ($unit == TimeZoneCalc::Hours) 
     return $total; 
    //min 
    $total = ($total * 60) + ($interval->i); 
    if ($unit == TimeZoneCalc::Minutes) 
     return $total; 
    //sec 
    $total = ($total * 60) + ($interval->s); 
    if ($unit == TimeZoneCalc::Seconds) 
     return $total; 

    return false; 
} 
19

Funkcja ta pozwala uzyskać całkowity czas w sekundach od DateInterval obiektu

/** 
* @param DateInterval $dateInterval 
* @return int seconds 
*/ 
function dateIntervalToSeconds($dateInterval) 
{ 
    $reference = new DateTimeImmutable; 
    $endTime = $reference->add($dateInterval); 

    return $endTime->getTimestamp() - $reference->getTimestamp(); 
} 
+1

Należy zauważyć, że DateTimeImmutable jest dostępne tylko z PHP 5.5 lub nowszym. – fiveDust