2009-11-24 46 views
1

你知道什麼時候在深夜,你的大腦被炸?我現在有一個晚上,我的功能到目前爲止是不應該的,所以請看看它: (我應該注意到,我使用PHP 5.2.9,功能/法DateTime:Diff()不可用,直到PHP 5.3.0。獲取兩次差異(Unix時代)

<?php 
    function time_diff($ts1, $ts2) { 
     # Find The Bigger Number 
     if ($ts1 == $ts2) { 
      return '0 Seconds'; 
     } else if ($ts1 > $ts2) { 
      $large = $ts1; 
      $small = $ts2; 
     } else { 
      $small = $ts1; 
      $large = $ts2; 
     } 
     # Get the Diffrence 
     $diff = $large - $small; 
     # Setup The Scope of Time 
     $s = 1;   $ss = 0; 
     $m = $s * 60; $ms = 0; 
     $h = $m * 60; $hs = 0; 
     $d = $h * 24; $ds = 0; 
     $n = $d * 31; $ns = 0; 
     $y = $n * 365; $ys = 0; 
     # Find the Scope 
     while (($diff - $y) > 0) { $ys++; $diff -= $y; } 
     while (($diff - $n) > 0) { $ms++; $diff -= $n; } 
     while (($diff - $d) > 0) { $ds++; $diff -= $d; } 
     while (($diff - $h) > 0) { $hs++; $diff -= $h; } 
     while (($diff - $m) > 0) { $ms++; $diff -= $m; } 
     while (($diff - $s) > 0) { $ss++; $diff -= $s; } 
     # Print the Results 
     return "$ys Years, $ns Months, $ds Days, $hs Hours, $ms Minutes & $ss Seconds."; 
    } 
    // Test the Function: 
    ediff(strtotime('December 16, 1988'), time()); 
    # Output Should be: 
    # 20 Years, 11 Months, 8 Days, X Hours, Y Minutes & Z Seconds. 
?> 
+1

這個社區wiki爲什麼? – Zak 2009-11-25 00:41:30

+1

我不想爲這個問題獲得任何榮譽。 – 2009-11-26 14:04:18

回答

1

如何:

function time_diff($t1, $t2) 
{ 
    $totalSeconds = abs($t1-$t2); 
    $date = getdate($totalSeconds); 
    $firstYear = getdate(0); 
    $years = $date['year']-$firstYear['year']; 
    $months = $date['mon']; 
    $days = $date['mday']; 
    $hours = $date['hour']; 
    $minutes = $date['minutes']; 
    $seconds = $date['seconds']; 

    return "$years Years, $months Months, $days Days, $hours Hours, $minutes Minutes & $seconds Seconds."; 
} 

它使用的日期給定時刻之差。然後你可以讓「getdate」爲你做所有的工作。唯一的挑戰是數年 - 這只是getdate年(差異)減去Unix時代的一年(1970年)。

如果你不喜歡使用的實際月份,你也可以在12個月等於

$months = $date['yday']/(365/12); 

同樣天可以計算出剩餘天數與劃分「年」一天的天數模

$days = $date['yday'] % (365/12); 
2

這不是一個回答你的問題,但我只是想指出...

while (($diff - $y) > 0) { $ys++; $diff -= $y; } 

是一個非常低效寫作方式

$ys = $diff/$y; 
$diff = $diff % $y; 

此外,該

 else if ($ts1 > $ts2) { 
       $large = $ts1; 
       $small = $ts2; 
     } else { 
       $small = $ts1; 
       $large = $ts2; 
     } 
     # Get the Diffrence 
     $diff = $large - $small; 

$diff = abs($ts1 - $ts2); 

我有一種感覺,在你的代碼中的問題將更加明顯,如果它是不那麼冗長可以很容易地被改寫。 :)

+2

在這裏同時計數$ diff。可以說它應該是$ ys = $ diff/$ y; $ diff = $ diff - $ ys * YEARS_IN_SECONDS,或任何常數。 – 2009-11-25 00:06:31

+1

啊對,很好的電話。我試圖用mod運算符修復它。 – Parappa 2009-11-25 00:20:25

+0

一直這樣做...5年,我仍然寫一些可怕的代碼。它永遠不會結束嗎?謝謝你的評論。 – 2009-11-25 16:05:04

2

怎麼樣用一個簡單的

$diff = abs($ts2 - $ts1); 

簡化了第一部分,然後,當你這樣做:

$n = $d * 31; $ns = 0; 
$y = $n * 365; $ys = 0; 

你實際上是在說,每年由36531天長個月。這實際上是大約36年的時間。可能不是你想要的。

最後,我們都在這裏長大。請使用長大的變量名,例如$ YEAR_IN_SECONDS而不是$ ys。正如你可以清楚地看到的那樣,你可以編寫一次代碼,但其他20個schmucks將不得不閱讀它很多次。

+0

+1。你擊敗了我。 :) – Parappa 2009-11-25 00:05:17

+0

我必須承認,我從來沒有想過使用abs函數,因爲我從來沒有用過它。好的指針,謝謝。 – 2009-11-25 16:06:00

2

在所需的所有個月的情況下給定的時間戳記時那麼我們用下面的編碼在PHP中:

function MonthsBetweenTimeStamp($t1, $t2) { 
    $monthsYear = array(); 
    $lastYearMonth = strtotime(gmdate('F-Y', $t2)); 
    $startYearMonth = strtotime(gmdate('F-Y', $t1)); 
    while ($startYearMonth < $lastYearMonth) { 
     $monthsYear[] = gmdate("F-Y", $startYearMonth); 
        //Increment of one month directly 
     $startYearMonth = strtotime(gmdate("F-Y", $startYearMonth) . ' + 1 month'); 
    } 

    if (empty($monthsYear)) { 
     $monthsYear = array($startYearMonth)); 
    } 

    return $monthsYear;