PHP:Datetime :: Diff结果比较

时间:2012-01-04 09:39:01

标签: php datetime comparison diff

我试图比较两个日期之间的差异,但似乎结果非常错误,例如此代码:

$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来检查差异,感谢答案

6 个答案:

答案 0 :(得分:7)

似乎DateInterval没有在内部实现比较功能。允许扩展为其预定义类定义自定义比较规则。显然它回归到一个松散的比较,即对象属于同一类。

This feature request提供了一个补丁来添加此功能,但它似乎没有在任何时候进入源代码。

要解决此问题,您可以自己比较对象的每个成员变量(年,月等),也可以将每个对象转换为数组:

if ((array) $interval == (array) $interval2) {
    echo 'true';
} else {
    echo 'false';
}

答案 1 :(得分:3)

您只有comparing that the two objects­Docs属于同一类型(且道具价值相同),但并非相同:

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