2010-07-04 121 views
71

計算兩個日期之間的總秒數的最佳方法是什麼?到目前爲止,我已經試過沿着線的東西:計算PHP中的總秒數DateInterval

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

然而,DateInterval對象的days財產似乎在目前的PHP5.3版本(至少在Windows上被打破,它總是返回相同的6015值)。我也試圖做到這一點,其中將無法保存天數各月(發至30日)的方式,閏年等:

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

但我真的不開心使用這種半提供的解決方案。

+0

什麼是結果'$Δ - >格式( 「%R%S」) '? – warrenm 2010-07-05 00:01:28

+1

@warrenm format格式的問題是當秒數爲0而分鐘數爲1時,'$ delta->格式(「%r%s」)'結果爲0 :( – zapadlo 2012-08-15 14:34:25

+3

更糟糕但是,現在有人正在修正從粘貼上述EXACT代碼的編碼人員那裏獲得的代碼審查中發現的缺陷 - 不是每個月都有30天,並且每年都有365天。:) [編輯:編碼器可能已經我自己!] – taiganaut 2012-11-02 21:42:52

回答

152

難道你不能比較time stamps嗎?

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

我想我沒有RTFM ...這就是我要找的;非常感謝! – efritz 2010-07-05 01:24:35

+2

+1:很好,很乾淨!請注意,'getTimestamp()'方法在PHP> = 5.3.0中可用。 – Sk8erPeter 2012-06-19 11:43:19

+1

我認爲這樣做沒有潛在的邊緣情況(儘管剛剛花了10個月的時間對一個大型PHP應用程序進行DateTime重構,我不會打賭),但應該指出,這是一個解決方法,它不能解決比較-DateIntervals問題。擁有這種能力仍然非常棒。 – taiganaut 2012-11-02 21:41:29

-6

你可以放在硬數字(而不是60 * 60 - 放在3600),所以它不需要每次計算它們。

編輯 - 修復了基於您評論的數字。

+0

這很好,它可能會在PHP中運行速度提高一小部分,但它仍然使我與上面的例子有相同的錯誤計算。 – efritz 2010-07-05 01:26:59

4

你可以做這樣的:

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

$differenceInSeconds = $currentTime - $timeInPast; 

時間()返回從epoch時間以秒爲當前時間(1970-01-01T00:00:00),以及做的strtotime相同,但基於您提供的特定日期/時間。

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

此功能可以得到總的持續時間(秒)從DateInterval對象

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

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

應該指出的是,DateTimeImmutable僅適用於PHP 5.5或更高版本。 – fiveDust 2015-05-07 11:34:40