我试图比较两个日期之间的差异,但似乎结果非常错误,例如此代码:
$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days')."<br />";
$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-15');
$interval2 = $datetime1->diff($datetime2);
echo $interval2->format('%R%a days')."<br />";
if($interval == $interval2){ echo "true"; }else{echo "false"; }
返回true,但在上面你可以看到日期差异不一样,实际上echo打印+2和+4。如何比较2个日期差异?
编辑:datetime :: diff返回一个dateinterval对象,实际上它没有实现比较运算符,https://bugs.php.net/bug.php?id=49914 我将使用dateinterval vars来检查差异,感谢答案
答案 0 :(得分:7)
似乎DateInterval没有在内部实现比较功能。允许扩展为其预定义类定义自定义比较规则。显然它回归到一个松散的比较,即对象属于同一类。
This feature request提供了一个补丁来添加此功能,但它似乎没有在任何时候进入源代码。
要解决此问题,您可以自己比较对象的每个成员变量(年,月等),也可以将每个对象转换为数组:
if ((array) $interval == (array) $interval2) {
echo 'true';
} else {
echo 'false';
}
答案 1 :(得分:3)
您只有comparing that the two objectsDocs属于同一类型(且道具价值相同),但并非相同:
if ($interval === $interval2) {echo "true";} else {echo "false";}
^^^
请注意,您正在进行对象比较,而不是进行值比较,例如使用字符串。
答案 2 :(得分:2)
我已经扩展了php类。方法比较进行值比较。它使用php DateInterval类中变量的“自然”顺序。 foreach周期首先是几年,然后是几个月,然后是几天,等等。这可能不是一个非常便携的解决方案,但它似乎在php 5.3中运行得很好。
/**
* Description of DateInterval
*
* @author Santhos
*/
class DateInterval extends \DateInterval
{
/**
* compares two date intervals
* returns:
* 0 - when they are equal
* less than zero - $a is less than $b
* greater than zero - $a is greater than $b
*
* @param \Designeo\Utils\DateInterval $dateInterval
* @return int
*/
public static function compare($a, $b)
{
// check parameters
self::isDateInterval($a);
self::isDateInterval($b);
foreach ($a as $key => $value) {
// after seconds 's' comes 'invert' and other crap we do not care about
// and it means that the date intervals are the same
if ($key == 'invert') {
return 0;
}
// when the values are the same we can move on
if ($a->$key == $b->$key) {
continue;
}
// finally a level where we see a difference, return accordingly
if ($a->$key < $b->$key) {
return -1;
} else {
return 1;
}
}
}
private static function isDateInterval($object)
{
if (!is_a($object, 'DateInterval')) {
throw new \Exception('Parameter dateInterval type has to be a Dateinterval.');
}
}
public function compareToAnother($dateInterval) {
return self::compare($this, $dateInterval);
}
}
答案 3 :(得分:0)
您将$ datetime1-&gt; diff($ datetime2)分配给$ interval和$ interval2,因此它们具有完全相同的值
答案 4 :(得分:0)
我记得有一个函数可以像这样比较php中的日期。
compare_dates($start_date,$end_date);
答案 5 :(得分:0)
我使用以下方式在两个DateIntervals之间进行了比较:
version_compare(join('.', (array) $dateIntervalA), join('.', (array) $dateIntervalB));