1

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

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

4 回答 4

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

我有一种感觉,如果代码不那么冗长,代码中的问题会更加明显。:)

于 2009-11-25T00:02:44.040 回答
2

如何用一个简单的简化第一部分

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

然后,当你这样做时:

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

您实际上是在说一年由 365 个 31 天的月份组成。这实际上是大约 36 年之久的年。可能不是你想要的。

最后,我们都在这里长大。请使用成熟的变量名称,即 $YEAR_IN_SECONDS 而不是 $ys。如您所见,您可能只编写一次代码,但其他 20 个笨蛋将不得不阅读很多次。

于 2009-11-25T00:03:34.217 回答
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; 
于 2014-03-31T12:56:26.670 回答
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);
于 2009-11-25T01:01:46.997 回答