-1

我有一个正在开发的待办事项列表应用程序。它显示创建待办事项时的时间戳,甚至允许用户选择格式。

在此代码段中,代码从 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以“几天前”的格式显示?谢谢!

4

2 回答 2

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 秒前”,这是您的原始代码所针对的结果类型。这个答案只会显示最大的单位。

于 2012-07-17T07:38:59.170 回答
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;
                }
            }
        }
    }
于 2013-08-16T19:39:36.563 回答