0

我有一个函数可以从帖子中获取日期,并且应该写下它是多久前发布的。当我使用该功能时,它说它是在 43 年零 4 个月前出于某种奇怪的原因发布的。

function relativeTime($date,$precision=2)
{
$times=array(365*24*60*60   => "year",
            30*24*60*60     => "month",
            7*24*60*60      => "week",
            24*60*60        => "day",
            60*60           => "hour",
            60              => "minute",
            1               => "second");

$passed=time()-$date;

if($passed<5)
{
    $output='less than 5 seconds ago';
}
else
{
    $output=array();
    $exit=0;
    foreach($times as $period=>$name)
    {
        if($exit>=$precision || ($exit>0 && $period<60))    break;
        $result = floor($passed/$period);

        if($result>0)
        {
            $output[]=$result.' '.$name.($result==1?'':'s');
            $passed-=$result*$period;
            $exit++;
        }

        else if($exit>0) $exit++;

    }
    $output=implode(' and ',$output).' ago';
}

return $output;
}

我正在使用以下方法输入日期: $date = date("Y-m-d H:i:s");

关了吗$passed=time()-$date

感谢大家!

4

3 回答 3

2

time()给你一个时间戳,即一个整数,表示自 1970-01-01 00:00:00 UTC 以来的秒数。

date("Y-m-d H:i:s")给你一个字符串,例如2013-05-13 02:04:34

当您减去这两个值时,字符串将根据字符串的初始字符转换为整数。这会产生 2013,它不会对时间戳产生太大影响。

对输入参数和要从中减去的值使用通用格式。在对时间实例进行计算时,时间戳通常比任何字符串格式(用于表示,而不是计算)更容易处理。我会更改函数定义以接受时间戳。

于 2013-05-13T00:05:27.813 回答
1

您正在使用$date = date("Y-m-d H:i:s");作为输入,它将返回类似于2013-05-13 02:04:05现在的内容。调用time()当前将返回一个值 near 1368403494。将两者相减,日期字符串将被 PHP 隐式静默转换为整数,因此2013. 这意味着它会在大约 1368403494 秒前看到您的帖子,而不是完全意外地在 1970 年 1 月的某个地方结束,即 Unix 时间戳时代的开始。所以是的,那将是大约 43 岁零几个月大。

不要混合使用字符串和整数算术,PHP 的静默转换会让它们陷入困境。

于 2013-05-13T00:08:24.183 回答
1

有一个更好的方法来做到这一点。使用DateTime 及其相关的类。该代码更简单、更准确,因为它考虑了时区和夏令时。

$datetime1 = new DateTime();
$datetime2 = new DateTime('2013-01-03 17:13:00');
$interval  = $datetime1->diff($datetime2);
$elapsed   = $interval->format('%y years, %m months, %a days, %h hours, 
                              %i minutes, %S seconds');
$elapsed = str_replace(array('0 years,', ' 0 months,', ' 0 days,', 
                            ' 0 hours,', ' 0 minutes,'), '', $elapsed);
$elapsed = str_replace(array('1 years, ', ' 1 months, ', ' 1 days, ', 
                             ' 1 hours, ', ' 1 minutes'), array('1 year, ', 
                             '1 month, ', ' 1 day, ', ' 1 hour, ', ' 1 minute'), 
                       $elapsed);
echo $elapsed;
于 2013-05-13T00:20:34.957 回答