我正在尝试编写一个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这是错的。
有任何关于如何克服这个问题的想法吗?
答案 0 :(得分:2)
试试这个:
$interval = $date2->diff($date1);
$returnValue = $interval->d <= 5 && !$interval->invert;
$returnValue
将为true
或false
(布尔类型)。
修改强>
确切地说 - 要将其评估为1
或0
,您可以
$returnValue = (int) ($interval->d <= 5 && !$interval->invert);
编辑#2:
$interval->invert
是告知您$date2
和$date1
之间的差异是负(1)还是正(0)的属性。令人困惑的是 - diff
方法中的计算始终是第二个对象(方法参数)减去第一个对象(方法被调用者)所以如果假设
$date1 > $date2
是真的那么
$date1->diff($date2)
是否定的(在快捷方式中)。
答案 1 :(得分: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)
答案 2 :(得分:0)
我想你想要过去的天数。如果是这样的话:
$interval = $date1->diff($date2)->days;
答案 3 :(得分: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;
}
答案 4 :(得分:-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;
}
}