2011-10-21 16 views
21

Witam wszystkich Próbuję obliczyć czas, który upłynął w php. Problem nie leży w php, ale w moich umiejętnościach matematycznych. Na przykład: Czas In: 11:35:20 (hh: mm: ss), teraz powiedz, że aktualny czas to: 12:00:45 (hh: mm: ss), wtedy różnica czasu w mojej formule daje wynik: 1: -34: 25. Powinno to być: 25:25Oblicz czas, który upłynął w php

$d1=getdate(); 
$hournew=$d1['hours']; 
$minnew=$d1['minutes']; 
$secnew=$d1['seconds']; 

$hourin = $_SESSION['h']; 
$secin = $_SESSION['s']; 
$minin = $_SESSION['m']; 

$h1=$hournew-$hourin; 
$s1=$secnew-$secin; 
$m1=$minnew-$minin; 

if($s1<0) { 
    $s1+=60; } 
if($s1>=(60-$secin)) { 
    $m1--; } 
if($m1<0) { 
    $m1++; } 
echo $h1 . ":" . $m1 . ":" . $s1; 

Proszę o pomoc?

EDIT

Niestety pewnie miał dodać, że strona odświeża się co drugi, aby wyświetlić nowy czas, który upłynął więc muszę używać metody powyżej. Przepraszam, że nie wyjaśniłem poprawnie.

+0

Rozważ przekształcenie na znaczniki czasu za pomocą 'mktime()', a następnie wykonaj proste odejmowanie. A może dobrze byłoby po prostu pracować z 'time()' zamiast 'getdate()' w tym przypadku. –

+0

i czy stosowałeś podejście odwrotne? Znasz godzinę, w której użytkownik się zalogował, a następnie wyświetla rodzaj próby? – JellyBelly

+0

Niż wszyscy za odpowiedzi, w końcu udało mi się to sprawdzić po zapoznaniu się z odpowiedziami: 'if ($ s1 <0) { \t $ s1 + = 60; } jeśli ($ s1> = (60- $ secin)) { \t $ m1--; \t} jeśli ($ m1 <0) { $ m1 * = -1; $ m1 = (60 - $ m1); $ h1--; } ' – Wilest

Odpowiedz

37

Daje to liczbę sekund między początkiem i końcem.

<?php 

// microtime(true) returns the unix timestamp plus milliseconds as a float 
$starttime = microtime(true); 
/* do stuff here */ 
$endtime = microtime(true); 
$timediff = $endtime - $starttime; 

?> 

aby wyświetlić go zegara stylu potem, że można zrobić coś takiego:

<?php 

// pass in the number of seconds elapsed to get hours:minutes:seconds returned 
function secondsToTime($s) 
{ 
    $h = floor($s/3600); 
    $s -= $h * 3600; 
    $m = floor($s/60); 
    $s -= $m * 60; 
    return $h.':'.sprintf('%02d', $m).':'.sprintf('%02d', $s); 
} 

?> 

Jeśli nie chcesz wyświetlać numery po przecinku, wystarczy dodać round($s); do początku funkcji secondsToTime().

+0

Nie przeczytałeś poprawnie pytania. Nie chce mierzyć czasu wykonywania swojego skryptu, ale raczej arbitralny czas. –

+0

Przyznaję, że może to wprowadzać w błąd, ale nie prosi o benchmarking, ale o wyliczenie prostej różnicy czasu. Pomyśl o, powiedzmy, czasie podróży lub wyścigu, lub coś w tym stylu. –

+0

Niestety, musiałem dodać, że strona odświeża się co sekundę, aby wyświetlić nowy czas, więc muszę użyć mojej metody powyżej. Przepraszam, że nie wyjaśniłem poprawnie. – Wilest

7

Śledź swój czas za pomocą funkcji "time()". Możesz później przekonwertować 'time()' na inne formaty.

$_SESSION['start_time'] = time(); 

$end_time = time(); 

$end_time - $_SESSION['start_time'] = 65 seconds (divide by 60 to get minutes) 

Następnie można to później porównać do innej wartości.

Użyj mikrotomówki, jeśli potrzebujesz milisekundy.

+0

Upewnij się także, że funkcja PHP date() jest włączona. [link] (http://php.net/manual/en/function.date.php) – donutdan4114

20

Korzystanie PHP >= 5.3 można użyć DateTime i jego metody DateTime::diff(), która zwraca DateInterval obiektu:

$first = new DateTime('11:35:20'); 
$second = new DateTime('12:00:45'); 

$diff = $first->diff($second); 

echo $diff->format('%H:%I:%S'); // -> 00:25:25 
+1

'$ first = new DateTime ($ _ SESSION ['h']. ':'. $ _ SESSION ['m'] ":". $ _ SESSION ['s']); 'działa w celu wyodrębnienia obiektu DateTime z danych sesji. – Duroth

+0

Niestety używam php 5.2.6 – Wilest

0

Można wdrożyć rozwiązania pokazany, ale jestem lubiący pomocą phptimer class (lub innych, to koło został wynaleziony kilka razy). Zaletą jest to, że zazwyczaj można zdefiniować timer jako aktywny, co pozwala na pozostawienie wywołań czasowych w kodzie do późniejszego wykorzystania bez ponownego wpisywania wszystkich punktów czasowych.