2009-11-24 47 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;