时间戳为“X Days Ago”,无法正确修改脚本

时间:2012-07-17 07:23:34

标签: php mysql timestamp

我正在制作一个待办事项列表应用程序。它显示创建待办事项时的时间戳,甚至允许用户选择格式应该是什么。

在这个片段中,代码从mySQL数据库中获取信息,以了解如何格式化日期:

public function __toString(){
    // The string we return is outputted by the echo statement

    if ( $this->data['date_created'] == '') {
        $date_created =  date($GLOBALS["config"]["date_format"].' '.$GLOBALS["config"]["time_format"]);
    }
    else 
        $date_created = date($GLOBALS["config"]["date_format"].' '.$GLOBALS["config"]["time_format"], strtotime($this->data['date_created']));

(它从名为date_format的行和名为time_format的行中拉出来)

我正在尝试实现此代码:

function relativeTime($dt,$precision=2) {
    if(is_string($dt)) $dt = strtotime($dt);

    $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()-$dt;

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

我用$dt替换$date_created并尝试了不同的组合,但我似乎无法做到正确。我有一个前端错误告诉我相对时间是未定义的(它没有说错误消息中的relativeTime,它有一个小写的“t”)。我可以做些什么让$date_created以“几天前”格式出现?谢谢!

2 个答案:

答案 0 :(得分:1)

我会完全重写这个:

$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() - $dt;

if ($passed < 5) {
    echo "Less than 5 seconds ago.";
} else {
    foreach ($times as $period => $name) {
        if ($passed >= $period) {
            echo round($passed / $period) . " " . $name . "(s) ago";
            break;
        }
    }
}

请参阅此链接以获取示例(我已将$passed的值硬编码用于测试目的;您可以编辑该值以查看它如何影响事物):

http://ideone.com/e8KXK


顺便说一句,我已经意识到我认为你的原始解决方案试图完全解释已经过去的每一秒。从用户体验的角度来看,这是一个糟糕的主意。我认为很多用户不希望看到“创建1年零7个月19天4小时36分28秒”,这是您原始代码的结果类型正在拍摄。此答案仅显示最大单位。

答案 1 :(得分:0)

将此功能用于将来的日期或通过日期。

function relativeTime($dt,$precision=2) {
        if(is_string($dt)) $dt = strtotime($dt);
        $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 = abs(time() - $dt);

        if ($passed < 5) {
            echo "Less than 5 seconds ago.";
        } else {
            foreach ($times as $period => $name) {
                if ($passed >= $period) {
                    $value = round($passed / $period);
                    $nameReal = $name;
                    if($value != 1) $nameReal .= "s";

                    if(time() > $dt)
                        echo  $value . " " . $nameReal . " ago";
                    else
                        echo "In ". $value . " " . $nameReal;
                    break;
                }
            }
        }
    }