减去两个日期得到天数

3

我正在尝试编写一个PHP代码,能够计算两个日期之间相差的天数。我编写的代码如下:

<?php
$c_date = date("Y-m-d");
//Subtracting two dates.
$date1 = new DateTime($d_date); //$d_date gets its value from database which i havent shown here
$date2 = new DateTime($c_date);
$interval = $date1->diff($date2);
echo "difference " . $interval->y . " years, " . $interval->m." months, ".$interval->d." days ";
?>

现在上面的代码可以工作,但是我不能使用它来满足我的需求。我需要能够找出交货日期($d_date)是否在当前日期的5天内,并且如果是这种情况则返回值1。
所以,如果$c_date = "2013-09-24"和$d_date = "2013-09-30",那么我将返回1。 但问题是,当交货日期为"2013-09-19"时,交货日期已经过去很久了,我应该返回0,但是根据当前代码,天数差仍然是5,所以我将返回1,这是错误的。
有什么想法可以克服这个问题吗?

2
添加一个if语句来比较日期(哪个更大之类的),然后使用您已经拥有的5天差异逻辑。 - Maximus2012
你的代码在哪里返回任何东西?它只是打印出差异。 - andrewsi
我没有展示返回值,因为问题出在日期差异上,它无法区分较大和较小的日期,因此从较高的日期中减去较低的日期也是正数,这会导致混乱。 - Rick Roy
1
检查 $interval->invert,如果是过去的日期,它将为1 :) 如果间隔被反转则为1,否则为0 - Jason OOO
不知道 $interval->invert,谢谢 @JasonOOO,这将是更好的方法。 - Rick Roy
显示剩余3条评论
5个回答

2

试试这个:

$interval = $date2->diff($date1);
$returnValue = $interval->d <= 5 && !$interval->invert;

$returnValue 的值将是 truefalse(布尔类型)。

编辑:
更精确地说,要将其评估为 10,可以这样做:

$returnValue = (int) ($interval->d <= 5 && !$interval->invert);

编辑 #2:
$interval->invert 是一个属性,它告诉你 $date2$date1 之间的差值是负数(1)还是正数(0)。这很令人困惑 - 在 diff 方法中计算永远是第二个对象(方法参数)减去第一个对象(方法调用者),所以如果假设

$date1 > $date2

如果条件成立,则
$date1->diff($date2)

是负数(快捷方式)。

1
!$interval->invert 是什么意思? - Maximus2012
1
它告诉你日期之间的差异是负数(1)还是正数(0)。 - matewka
感谢更新。我认为这是一个高效的解决方案。 - Maximus2012

1
你可以比较两个日期时间对象,并检查交货日期是否大于当前日期,然后根据情况继续进行。
作为一个函数:
function check_date($d_date, $c_date)
{
    if($d_date > $c_date) {
        $date1 = new DateTime($d_date); //$d_date gets its value from database which i havent shown here
        $date2 = new DateTime($c_date);
        $interval = $date1->diff($date2);
        return "difference " . $interval->y . " years, " . $interval->m." months, ".$interval->d." days ";
    }
    else {
        return false;
    }

}

测试用例
var_dump( check_date('2013-09-30', '2013-09-24') );
var_dump( check_date('2013-09-19', '2013-09-24') ); 

输出:

string(37) "difference 0 years, 0 months, 6 days "
bool(false)

演示!


0

好的,这是所需的代码,正如Maximus2012建议的那样,使用if语句首先比较日期即可完成工作。 这是代码:

$date1 = new DateTime($ddate[$counter]);
                $date2 = new DateTime($c_date);
                if($date2>$date1)
                {
                    $stat = 0;
                }
$interval = $date1->diff($date2);
                $d_diff = $interval->d;
if($d_diff>5)
{
$stat = 0;
}

0

我认为您想要计算过去的天数。如果是这样,请使用以下代码:

$interval = $date1->diff($date2)->days;

-1

试试这个 :D

function dateInterval($current, $delivery, $days){
    $unixCurrent = strtotime($current);
    $unixDelivery = strtotime($delivery);
    if ($unixCurrent === false || $unixDelivery === false){
        return -2;
    }
    if ($unixCurrent > $unixDelivery){
        return -1;
    } else if ($unixCurrent+($days*86400) > $unixDelivery){
        return 1;
    } else {
        return 0;
    }
}

这个解决方案看起来是可行的,所以不确定为什么会被投票降低。您尝试运行代码以查看是否针对不同案例产生正确的输出? 在任何情况下,还有其他解决方案中发布的更有效的方法。 - Maximus2012
我知道有更好的方法,但这个也能用。我写得很快,但它确实能用,不知道为什么会被踩。 - Rociio Lourdes Rodriiguez

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