2012-04-23 31 views
16

我試圖讓兩個時間日期時間字符串(包括毫秒)從PHP日期字符串得到microtime中

例如之間傳遞:

$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/>"; 

我想看看呼應了什麼是「1.2」,但strtotime()忽略字符串的毫秒部分。此外,顯然microtime()不會讓你給它一個日期字符串...是否有一個替代函數來計算這個,或者我將不得不做一些字符串解析來提取秒和毫秒和減?

回答

11

改爲使用DateTime來嘗試。

這需要一些變通方法,因爲DateInterval(由DateTime::diff()返回)不計算微秒,所以你需要這種手工

$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; 

我總是建議DateTime由於其靈活性,你應該看看它

編輯

爲了向後保持兼容於PHP 5.2也採用相同的方法爲f或毫秒:

$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 ...這看起來很有希望,但它需要5.3+,我在5.2,我無法控制升級:(儘管 – slinkhi 2012-04-23 22:43:22

+0

是因爲DateTime :: diff()'。這意味着你會需要手動做這個減法,看看我的編輯:)。 – 2012-04-23 22:50:35

+0

我看...一般來說,這看起來像它幫助提取數據更容易(而不是使用正則表達式),但我認爲你的數學/邏輯是關閉的。例如,如果我有'$ pageTime = new DateTime(「2012-04-23T16:08:14.662-05:00」); $ rowTime = new DateTime(「2012-04-23T16:08:19.954-05:00」);'我應該得到'5.292',但它正在輸出'4.708'。此外,您的代碼僅處理秒和微秒之間的時間差異。如果你以'2012-04-23T16:08:59.9-05:00'開始並以'2012-04-23T16:09:00.1-05:00'結束,你應該得到'0.2',但是你的代碼會給我'58.2' ..(續) – slinkhi 2012-04-23 23:38:28

0

丹李的回答大廈,這裏是一個普遍的工作液:

$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; 

完整的解釋:

  • 我們存儲在$uDiff兩個日期之間簽署的微妙差異並以秒爲單位轉換結果除以1000 * 1000
  • 中操作數的順序非常重要,必須與$ timePassed操作中的相同。
  • 我們計算的Unix時間戳(全稱秒)兩個日期之間的差異,我們添加了微妙的差異,以獲得想要的結果
  • 使用DateTime::getTimestamp()將給出一個正確的答案,即使當差值大於60秒