PHP разделение приводит к NaN - может быть связано с функциями DateTime - PullRequest
1 голос
/ 08 сентября 2011

В настоящее время я пытаюсь выполнить функцию "время назад", но по какой-то причине она дает мне NaN для одного из результатов.

Я использую слегка модифицированную версию этогокусок кода (находится по адресу: http://www.sitepoint.com/create-your-own-twitter-widget-3/)

    if ($this->DateFormat == 'friendly') {
        // friendly date format
        $ival = $now->diff($stime);
        $yr = $ival->y;
        $mh = $ival->m + ($ival->d > 15);
        if ($mh > 11) $yr = 1;
        $dy = $ival->d + ($ival->h > 15);
        $hr = $ival->h;
        $mn = $ival->i + ($ival->s > 29);
        if ($yr > 0) {
            if ($yr == 1) $date = 'last year';
            else $date = $yr . ' years ago';
        }
        else if ($mh > 0) {
            if ($mh == 1) $date = 'last month';
            else $date = $mh . ' months ago';
        }
        else if ($dy > 0) {
            if ($dy == 1) $date = 'yesterday';
            else if ($dy < 8) $date = $dy . ' days ago';
            else if ($dy < 15) $date = 'last week';
            else $date = round($dy / 7) . ' weeks ago';
        }
        else if ($hr > 0) {
            $hr += ($ival->i > 29);
            $date = $hr . ' hour' . ($hr == 1 ? '' : 's') . ' ago';
        }
        else {
            if ($mn < 3) $date = 'just now';
            else $date = $mn . ' minutes ago';
        }
    }

(проблемная строка - строка с round($dy / 7)

. Я создал набор возможных значений для проверкирезультаты, и это дает мне NaN на дату -29 дней. Дело в том, что это происходит только тогда, когда я повторяю функцию снова и снова. Если я просто проверяю -29 дней в одиночку, он выводит мне правильный 4значение недели.

Есть идеи, как мне избежать / исправить это?

Редактировать

Скорее всего, это ошибка в PHP.

Если я заставлю код выполнить деление и округление дважды, NaN никогда не появится.

// do estimate of how many weeks ago
$round = round($days / 7, 0);
$round = round($days / 7, 0);

$date =  $round . ' weeks ago';

Я заметил это, потому что в моих тестовых циклах первое значение, которое инициировало вычисление недель (учитываяЯ делал более одного расчета) дал бы NaN.

Ответы [ 2 ]

2 голосов
/ 04 марта 2012

Интересно, мой хак сработал над подобной проблемой. Я просто поставил это перед операциями с датой:

if (is_nan($y1) || is_nan($y2)|| is_nan($z1)|| is_nan($z2)){ }

и остальное сработало. Очевидно, $ y1, $ y2 и т. Д. Как-то NAN ... Запуск XAMP, Win 7 x64, DENWER, PHP v 5.3 +

1 голос
/ 08 сентября 2011

Хотя я лично считаю, что это была ошибка (я обнаружил, что некоторые сообщения об ошибках и вопросы, связанные с переполнением стека, имеют похожие проблемы), похоже, больше не происходит после перехода с 5.3.1 на 5.3.5.

Этоупрощенный код, который даст мне NaN

// create datetimes
$date1 = new Datetime();
$date2 = new Datetime();

/* loop part - taken out for simplicity */

$date1->diff($date2);
echo 1 . "<br/>";
// 1

$date1->diff($date2);
echo 2 . "<br/>";
// 2

$date1->diff($date2);
echo round((29 / 7)) . "<br/>";
// NAN

$date1->diff($date2);
echo round((29 / 7)) . '<br/>';
// 4

(я запускал XAMPP 1.7.3 (PHP 5.3.1) в Windows)

...