-1

私が取り組んでいるtodoリストアプリがあります。todo が作成されたときのタイムスタンプを表示し、ユーザーが形式を選択できるようにします。

このスニペットでは、コードは 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 が定義されていないことを示すフロントエンド エラーがあります (エラー メッセージに 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 に答える