2
function RelativeTime($timestamp) {
    $difference = time() - $timestamp;
    $periods    = array(
        "sec", "min", "hour", "day", "week", "month", "years", "decade"
    );
    $lengths    = array("60", "60", "24", "7", "4.35", "12", "10");

    if ($difference > 0) { // this was in the past
        $ending = "ago";
    } else { // this was in the future
        $difference = -$difference;
        $ending     = "to go";
    }
    for ($j = 0; $difference >= $lengths[$j]; $j++)
        $difference /= $lengths[$j];
    $difference = round($difference);
    if ($difference != 1) $periods[$j] .= "s";
    $text = "$difference $periods[$j] $ending";
    return $text;
}

上記のPHP関数をインターウェブで見つけました。はるか先の日付に問題があることを除けば、かなりうまく機能しているようです。

たとえば、ループするPHPエラーが発生します

ゼロ除算

$difference /= $lengths[$j];日付が2033年の場合。

それを修正する方法はありますか?アレイはすでに数十年を占めているので、2033年が「あと20年」のようなものになることを期待しています。

4

1 に答える 1

3

問題は、2 番目の配列$lengthsに 7 つの要素が含まれているため、ループの最後の反復を実行するとき (10 で割った後 - 10 年間)$j = 7$lengths[7]定義されていないため、0 に変換されるため、テスト$difference >= $lengths[$j]が返されることtrueです。その後、コードは無限ループに入ります。この問題を克服するには、$lengths配列にもう 1 つの要素 (たとえば "100") を追加するだけで、for ループが数十年を処理した後に終了します。日付が 2038 年 1 月 19 日より前の場合、日付は UNIX タイムスタンプで表すことができることに注意してください。したがって、日付を 4 桁以上で計算することはできないため、ループから抜け出すには 100 で十分です。

于 2011-11-02T22:51:16.767 に答える