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 年会产生类似“未来 2 年”的结果。

4

1 回答 1

3

问题是第二个数组$lengths包含 7 个元素,因此在执行循环的最后一次迭代时(在除以 10 - 几十年后)未定义$j = 7$lengths[7]因此转换为 0,因此测试$difference >= $lengths[$j]返回true。然后代码进入一个无限循环。为了克服这个问题,只需在$lengths数组中再添加一个元素,比如“100”,这样 for 循环就会在处理完几十年后终止。请注意,如果日期在 2038 年 1 月 19 日之前,则可以在 UNIX 时间戳中表示。因此,您不能计算超过 4 个十进制的日期,因此 100 足以打破循环。

于 2011-11-02T22:51:16.767 回答