Ошибка с Zend_Date вычислением вычитания двух дат - PullRequest
3 голосов
/ 14 ноября 2011

Я пишу эту функцию:

public function calcDifferentDate($dateStart, $dateEnd = false, $output = Zend_Date::DAY)
{
    $dateEnd = $dateEnd ? $dateEnd : Zend_Date::now()->toString('YYYY-MM-dd');
    $dateStartZD = new Zend_Date($dateStart, 'YYYY-MM-dd');
    $dateEndZD = new Zend_Date($dateEnd, 'YYYY-MM-dd');
    return $dateEndZD->sub($dateStartZD)->toString($output);
}

Если вызвать это:

echo calcDifferentDate('2011-11-10');

, а сегодня: «2011-11-14», возвращаемый результат равен 05, а не04 почему?где я делаю не так?

PS Я использую ZF 1.11.11 версию


Я нашел решение

эта работа правильная!: D

public function calcDaysDiffDate($dateStart, $dateEnd = '')
{
    $dateEnd = !empty($dateEnd) ? $dateEnd : Zend_Date::now()->toString('YYYY-MM-dd');
    $dateStartZD = new Zend_Date($dateStart, 'YYYY-MM-dd');
    $dateEndZD = new Zend_Date($dateEnd, 'YYYY-MM-dd');
    $dateStartZD->sub($dateEndZD);
    return $dateStartZD->getTimestamp() / (60 * 60 * 24);
}

Ответы [ 3 ]

1 голос
/ 14 ноября 2011

Принятый ответ на этот вопрос: Как сравнить части даты двух объектов Zend_Date? рекомендует использовать DateTime вместо Zend_Date следующим образом (я немного изменил код в соответствии с вашими потребностями):

$date1 = new DateTime('2011-11-14');
$date2 = new DateTime('2011-11-10');
$diffDays = $date1->diff($date2)->days;

Я пробовал это, и, кажется, возвращает правильный результат. Это может быть хорошей альтернативой Zend_Date, если вы не обязаны его использовать.

Надеюсь, это поможет,

1 голос
/ 14 ноября 2011

Я нахожу решение:

public function calcDaysDiffDate($dateStart, $dateEnd = '')
{
    $dateEnd = !empty($dateEnd) ? $dateEnd : Zend_Date::now()->toString('YYYY-MM-dd');
    $dateStartZD = new Zend_Date($dateStart, 'YYYY-MM-dd');
    $dateEndZD = new Zend_Date($dateEnd, 'YYYY-MM-dd');
    $dateStartZD->sub($dateEndZD);
    return $dateStartZD->getTimestamp() / (60 * 60 * 24);
}
1 голос
/ 14 ноября 2011

Попробуйте вернуть это вместо:

$newDate = new Zend_Date($dateEndZD->sub($dateStartZD), 'YYYY-MM-dd');
return $newDate->get($output);

Расчеты неверны, я попытаюсь добраться до этого позже. Но сейчас вам нужно, чтобы ваша логика была похожа на это, потому что, как я сказал в моем комментарии, ваш метод приводил к fatal error из-за того, что вычитание даты возвращало целое число вместо Zend_Date объекта для вызова toString().

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

Извините за мой самонадеянный, не очень продуманный предыдущий ответ. После более тщательного тестирования я считаю, что нашел вашу проблему. Функция sub() принимает необязательный второй параметр $part, который является частью даты, которая будет возвращена из полученного вычитания даты. Не нужно звонить toString() сейчас, даже если бы вы могли.

Так что, без дальнейших разъяснений, здесь с фиксированным оператором возврата:

public function calcDifferentDate($dateStart, $dateEnd = false, $output = Zend_Date::DAY)
{
    $dateEnd = $dateEnd ? $dateEnd : Zend_Date::now()->toString('YYYY-MM-dd');
    $dateStartZD = new Zend_Date($dateStart, 'YYYY-MM-dd');
    $dateEndZD = new Zend_Date($dateEnd, 'YYYY-MM-dd');
    return $dateEndZD->sub($dateStartZD, $output); // <-- fixed
}

Второе редактирование

После разговора с OP кажется, что мое решение не будет работать для ZF 1.11.x из-за различий в методе Zend_Date::sub().

...