获得两次之间的差异(Unix时代)

时间:2009-11-24 23:58:13

标签: php date time epoch

你知道什么时候深夜,你的大脑被炒了?我现在正在进行其中一个夜晚,到目前为止我的功能还没有正常工作,所以请看一下: (我应该注意到我使用的是PHP 5.2.9,并且在PHP 5.3.0之前函数/方法DateTime:Diff()不可用。

<?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.
?>

4 个答案:

答案 0 :(得分: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);

我觉得如果代码中的问题不那么详细,那么代码中的问题会更明显。 :)

答案 1 :(得分:2)

如何用简单的

简化第一部分
$diff = abs($ts2 - $ts1);

然后,当你这样做时:

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

你实际上是说一年由365个31天长的月组成。这实际上是大约36年的长度。可能不是你想要的。

最后,我们都是成年人。请使用成熟的变量名称,即$ YEAR_IN_SECONDS而不是$ ys。正如你可以清楚地看到的,你可能会编写一次代码,但其他20个骗子将不得不多次阅读它。

答案 2 :(得分: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; 

答案 3 :(得分: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”为你完成所有的工作。唯一的挑战是数年 - 这是简单的最新年份(差异)减去Unix纪元年(1970年)。

如果您不喜欢使用实际月份,您还可以将“年”日除以12个相等月的天数

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

同样,天数可以计算出模数

的剩余天数
$days = $date['yday'] % (365/12);