Zend_Date计算两个日期相减出现错误

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,为什么?我做错了什么吗?

附注:我使用的是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);
}

我得到了Fatal error: Call to a member function toString() on a non-object in ...和$dateEndZD->sub($dateStartZD)返回345600。 - Yes Barry
这个函数应该做什么?我现在看了30秒,但是对我来说毫无意义。 - Gordon
我的函数用于计算两个日期之间的天数差异,不清楚吗?:S - JellyBelly
3个回答

1

尝试返回这个:

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

计算结果不正确,我会尝试稍后解决。但是现在,您需要使您的逻辑类似于此,因为正如我在评论中所说,您的方法由于日期减法返回整数而不是Zend_Date对象而导致致命错误

编辑

对于我之前自以为是、没有经过深思熟虑的答案,我感到抱歉。经过更加仔细的测试,我相信我找到了您的问题。 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() 方法有所不同。


我有点做了,但我半睡半醒的。这里快日出了,我还没睡觉。对不起,我的回答只有一半。如果你明天还没有找到解决方案,我一定会再试一次,这次我会全神贯注地工作。 - Yes Barry
好的,算了,我不能就这样放着不管。我想我找到了解决办法。现在试一下。 - Yes Barry
更正:我知道我找到了解决方案。我已经使用大约5个不同的日期测试了该函数,它们都有效。 - Yes Barry
抱歉,但您的解决方案返回了一个Zend_Date对象而不是数字日期!:S - JellyBelly
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/4971/discussion-between-jellybelly-and-mmmshuddup - JellyBelly
显示剩余2条评论

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,那么它可能是一个很好的替代选择。

希望这有所帮助,


你的解决方法很好,但我总是很好奇为什么使用Zend_Date的解决方案不能按预期运行。 - JellyBelly
第二次查看您的解决方案后发现并不是我需要的!为什么不尝试一下差异符号的方法呢?您的方法返回简单的差异而不是-1或1,而这正是我的情况!:S - JellyBelly
我不确定我理解了你的评论...在你对原问题的评论中,你说这个函数“用于计算两个日期之间的天数差”,对吗? - dinopmi
是的,你说得完全正确,但是当我输入 2011-11-102011-11-14 时,我必须返回 -4 而不是 4 - JellyBelly
我说的不同是减法! - JellyBelly
好的,我现在明白了。在这种情况下,您可以将 diff 的调用与比较运算符结合使用,根据文档,DateTime 对象支持比较运算符:http://au.php.net/manual/en/datetime.diff.php - dinopmi

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接