2012-04-23 40 views
16

tôi đang cố gắng để có được thời gian trôi qua giữa hai chuỗi datetime (bao gồm mili giây)php được microtime kể từ ngày chuỗi

dụ:

$pageTime = strtotime("2012-04-23T16:08:14.9-05:00"); 
$rowTime = strtotime("2012-04-23T16:08:16.1-05:00"); 
$timePassed = $rowTime - $pageTime; 
echo $timePassed . "<br/><br/>"; 

Những gì tôi muốn nhìn thấy lặp lại là "1.2" nhưng strtotime() bỏ qua phần mili giây của chuỗi. Ngoài ra, rõ ràng microtime() không cho phép bạn cung cấp cho nó một datestring ... Có một chức năng thay thế để tính toán này, hoặc tôi sẽ phải làm một số phân tích chuỗi để trích xuất các giây và mili giây và trừ?

Trả lời

11

Hãy thử thay thế bằng DateTime.

này cần một chút của một workaround vì DateInterval (được trả về bởi DateTime::diff()) không tính toán micro, vì vậy bạn cần phải điều này bằng tay

$pageTime = new DateTime("2012-04-23T16:08:14.1 - 5 hours"); 
$rowTime = new DateTime("2012-04-23T16:08:16.9 - 5 hours"); 

// the difference through one million to get micro seconds 
$uDiff = abs($pageTime->format('u')-$rowTime->format('u'))/(1000 * 1000); 

$diff = $pageTime->diff($rowTime); 

echo $diff->format('%s')-$uDiff; 

tôi luôn khuyên DateTime vì tính linh hoạt của nó, bạn nên xem xét nó

EDIT

Đối ngược compability để PHP 5.2 phải mất phương pháp tương tự như f hoặc mili giây:

$pageTime = new DateTime("2012-04-23T16:08:14.1 - 5 hours"); 
$rowTime = new DateTime("2012-04-23T16:08:16.9 - 5 hours"); 

// the difference through one million to get micro seconds 
$uDiff = abs($pageTime->format('u')-$rowTime->format('u'))/(1000 * 1000); 


$pageTimeSeconds = $pageTime->format('s'); 
$rowTimeSeconds = $rowTime->format('s'); 

if ($pageTimeSeconds + $rowTimeSeconds > 60) { 
    $sDiff = ($rowTimeSeconds + $pageTimeSeconds)-60; 
} else { 
    $sDiff = $pageTimeSeconds - $rowTimeSeconds; 
} 


if ($sDiff < 0) { 
    echo abs($sDiff) + $uDiff; 
} else { 
    // for the edge(?) case if $dt2 was smaller than $dt 
    echo abs($sDiff - $uDiff); 
} 
+0

darn ... điều này có vẻ hứa hẹn nhưng nó yêu cầu 5.3+ và tôi là 5.2 và tôi không có quyền kiểm soát nâng cấp: (+1 mặc dù – slinkhi

+0

Đó là vì 'DateTime :: diff()'. Điều này có nghĩa là bạn sẽ cần phải làm điều đó bằng tay quá, xem chỉnh sửa của tôi :). –

+0

Tôi thấy ... nói chung, điều này có vẻ như nó giúp trích xuất dữ liệu dễ dàng hơn (như trái ngược với sử dụng regex) nhưng tôi nghĩ rằng toán/logic của bạn là tắt. Ví dụ: nếu tôi có '$ pageTime = new DateTime (" 2012-04-23T16: 08: 14.662-05: 00 "); $ rowTime = new DateTime ("2012-04-23T16: 08: 19.954-05: 00"); 'Tôi sẽ nhận được '5.292' nhưng nó xuất ra' 4.708'. Ngoài ra, mã của bạn chỉ giải quyết một sự khác biệt về thời gian giữa giây và micro giây. Điều gì xảy ra nếu bạn bắt đầu với '2012-04-23T16: 08: 59.9-05: 00' và kết thúc bằng' 2012-04-23T16: 09: 00.1-05: 00' bạn sẽ nhận được '0.2' nhưng mã của bạn cho tôi '58.2' .. (tiếp theo) – slinkhi

0

Xây dựng về câu trả lời Dan Lee, đây là một giải pháp phổ biến làm việc:

$pageTime = new DateTime("2012-04-23T16:08:14.9-05:00"); 
$rowTime = new DateTime("2012-04-23T16:08:16.1-05:00"); 

$uDiff = ($rowTime->format('u') - $pageTime->format('u'))/(1000 * 1000); 

$timePassed = $rowTime->getTimestamp() - $pageTime->getTimestamp() + $uDiff; 

giải thích đầy đủ:

  • Chúng tôi lưu trữ các micro khác biệt được ký kết giữa cả hai ngày trong $uDiff và chuyển đổi kết quả tính bằng giây bằng cách chia cho 1000 * 1000
  • Thứ tự của toán hạng trong $uDiff là quan trọng và phải giống như trong hoạt động $ timePassed.
  • Chúng tôi tính toán dấu thời gian Unix (đầy đủ giây) chênh lệch giữa hai ngày và chúng tôi thêm phần chênh lệch micro để có được kết quả mong muốn
  • Sử dụng DateTime::getTimestamp() sẽ đưa ra một câu trả lời đúng ngay cả khi sự chênh lệch lớn hơn 60 giây
Các vấn đề liên quan