3

我写了这个函数:

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

3 回答 3

1

尝试返回这个:

$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
}

第二次编辑

Zend_Date::sub()与 OP 聊天后,由于方法的差异,我的解决方案似乎不适用于 ZF 1.11.x。

于 2011-11-14T11:11:09.507 回答
1

这个问题的公认答案:如何比较两个 Zend_Date 对象的日期部分?建议使用DateTime而不是Zend_Date以下方式(我已经修改了代码以满足您的需要):

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

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

希望有帮助,

于 2011-11-14T12:53:23.937 回答
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);
}
于 2011-11-14T16:33:43.767 回答