用Zend_Date计算减法两个日期的bug

时间:2011-11-14 10:11:10

标签: php zend-framework date zend-date

我写这个函数:

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 为什么?我在哪里做错了?

P.S。我使用的是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 个答案:

答案 0 :(得分:1)

请尝试返回此内容:

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

计算结果不正确,我稍后会尝试解决。但就目前而言,您需要将逻辑与此类似,因为正如我在评论中所说,由于您的日期减法,您的方法导致了fatal error返回一个整数而不是Zend_Date对象,可以从中调用toString()

修改

很抱歉我以前的答案是冒昧的,没有经过深思熟虑的。经过更多小心测试后,我相信我找到了您的问题。 sub()函数接受一个可选的第二个参数$part,它是日期的一部分,将从结果日期减法返回。即使你可以,也不需要现在拨打toString()

所以没有进一步的说明,这里有固定的return语句:

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聊天后,由于Zend_Date::sub()方法存在差异,我的解决方案似乎不适用于ZF 1.11.x.

答案 1 :(得分:1)

此问题的已接受答案:How to compare the date parts of two Zend_Date objects?建议以下列方式使用DateTime代替Zend_Date(我已根据您的需要修改了代码):

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

我已经尝试过,它似乎返回了正确的结果。如果您不是绝对需要使用它,它可能是Zend_Date的一个很好的替代品。

希望有所帮助,

答案 2 :(得分:1)

我找到解决方案:

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);
}