PHP функция для расчета относительного времени (человек читаемый / стиль Facebook) - PullRequest
2 голосов
/ 02 ноября 2011
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 десятилетия вперед».

1 Ответ

2 голосов
/ 03 ноября 2011

Проблема в том, что второй массив $lengths содержит 7 элементов, поэтому при выполнении последней итерации цикла (после деления на 10 - для десятилетий) $j = 7, $lengths[7] не определено, поэтому преобразуется в 0 и поэтому тест $difference >= $lengths[$j] возвращает true. Затем код входит в бесконечный цикл. Чтобы преодолеть эту проблему, просто добавьте еще один элемент в массив $lengths, скажем «100», чтобы цикл for завершился после обработки десятилетий. Обратите внимание, что даты могут быть представлены в метке времени UNIX, если они находятся до 19 января 2038 года. Поэтому вы не можете вычислять даты более чем за 4 десятичных знака, поэтому достаточно 100, чтобы выйти из цикла.

...