前一段时间功能准确

时间:2013-05-13 00:00:36

标签: php date

我有一个函数,从帖子中获取日期,并且应该写多久以前发布的日期。当我使用该功能时,它说它是在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关闭了吗?

谢谢大家!

3 个答案:

答案 0 :(得分:2)

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

date("Y-m-d H:i:s")会为您提供一个字符串,例如2013-05-13 02:04:34

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

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

答案 1 :(得分:1)

您正在使用$date = date("Y-m-d H:i:s");作为输入,现在将返回类似于2013-05-13 02:04:05的内容。对time()的调用目前会返回1368403494附近的值。从彼此中减去这两个,并且日期字符串将由PHP隐式地静态转换为整数,因此2013。这意味着它会在1368403494秒之前看到你的帖子,而不是完全意外地在1970年1月的某个地方结束,这是Unix时间戳时代的开始。所以,这将是43岁零几个月。

不要混用字符串和整数运算,PHP的无声转换会让它们变得很糟糕。

答案 2 :(得分:1)

有一个很多更好的方法来做到这一点。使用DateTime and its associated classes。代码更简单,更准确,因为它需要考虑时区和日光的节省时间。

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