2011-10-21 42 views
21

Xin chào tất cả Tôi đang cố tính thời gian trôi qua trong php. Vấn đề không phải là trong php, đó là với các kỹ năng toán học của tôi. Ví dụ: Thời gian Trong: 11:35:20 (hh: mm: ss), giờ nói thời gian hiện tại là: 12:00:45 (hh: mm: ss) thì chênh lệch thời gian trong công thức của tôi cho đầu ra: 1: -34: 25. Thực tế là: 25:25Tính thời gian đã trôi qua trong 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; 

Mọi trợ giúp xin vui lòng?

EDIT

Xin lỗi tôi có lẽ phải nói thêm rằng trang làm mới mỗi giây để hiển thị thời gian trôi qua mới vì vậy tôi phải sử dụng phương pháp của tôi ở trên. Lời xin lỗi của tôi vì đã không giải thích chính xác.

+0

Xem xét chuyển đổi thành dấu thời gian bằng 'mktime()' và sau đó thực hiện phép trừ đơn giản. Và có lẽ bạn nên làm việc với 'time()' thay vì 'getdate()' trong trường hợp đó. –

+0

và nếu bạn đang sử dụng một cách tiếp cận nghịch đảo? Bạn biết thời gian người dùng đăng nhập và sau đó hiển thị một loại thử nghiệm? – JellyBelly

+0

Hơn tất cả các câu trả lời, cuối cùng tôi đã làm việc đó sau khi xem xét tất cả các câu trả lời sau: 'if ($ s1 <0) { \t $ s1 + = 60; } nếu ($ s1> = (60- $ secin)) { \t $ m1--; \t} nếu ($ m1 <0) { $ m1 * = -1; $ m1 = (60 - $ m1); $ h1--; } ' – Wilest

Trả lời

37

Điều này sẽ cung cấp cho bạn số giây giữa bắt đầu và kết thúc.

<?php 

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

?> 

Để hiển thị nó đồng hồ mang phong cách sau đó, bạn muốn làm điều gì đó như thế này:

<?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); 
} 

?> 

Nếu bạn không muốn hiển thị những con số sau chữ số thập phân, chỉ cần thêm round($s); để đầu của hàm secondsToTime().

+0

Bạn không đọc câu hỏi đúng cách. Anh ta không muốn đo thời gian chạy kịch bản của mình, mà là một khoảng thời gian tùy ý. –

+0

Tôi biết rằng nó có thể gây hiểu lầm, nhưng imho anh ta không yêu cầu điểm chuẩn, nhưng để tính toán một sự khác biệt thời gian đơn giản. Hãy suy nghĩ, giả sử, thời gian đi lại, hoặc cuộc đua, hoặc một cái gì đó như thế –

+0

Xin lỗi tôi có thể phải thêm rằng trang làm mới mỗi giây để hiển thị thời gian trôi qua mới vì vậy tôi phải sử dụng phương pháp của tôi ở trên. Lời xin lỗi của tôi vì đã không giải thích chính xác. – Wilest

7

Theo dõi thời gian của bạn bằng chức năng 'time()'. Sau đó, bạn có thể chuyển đổi 'time()' thành các định dạng khác.

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

$end_time = time(); 

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

Và sau đó bạn có thể so sánh giá trị đó với giá trị khác sau này.

Sử dụng microtime nếu bạn cần chi tiết về mili giây.

+0

Ngoài ra, hãy đảm bảo bạn kiểm tra hàm PHP date(). [link] (http://php.net/manual/en/function.date.php) – donutdan4114

20

Sử dụng PHP >= 5.3 bạn có thể sử dụng DateTime và phương pháp của nó DateTime::diff(), mà trả về một đối tượng DateInterval:

$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']. ':'. $ _ PHẦN ['m'] . ':'. $ _ SESSION ['s']); 'hoạt động để tạo đối tượng DateTime trong dữ liệu Session đã cho. – Duroth

+0

tiếc là tôi đang sử dụng php 5.2.6 – Wilest

0

Bạn có thể thực hiện các giải pháp hiển thị, nhưng tôi thích sử dụng phptimer class (hoặc người khác, bánh xe này đã được phát minh một vài lần). Ưu điểm là bạn thường có thể xác định bộ định thời hoạt động hay không, do đó cho phép bạn để các cuộc gọi hẹn giờ trong mã của bạn để tham khảo sau này mà không cần phải khóa lại tất cả các điểm thời gian.

Các vấn đề liên quan