PHP: Datetime :: Diff результаты сравнения - PullRequest
6 голосов
/ 04 января 2012

Я пытался сравнить разницу между двумя датами, но, похоже, результаты довольно неправильные, например, этот код:

$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, но выше вы можете увидеть, что различия в датах нето же самое, на самом деле эхо-отпечатки +2 и +4.Любая идея о том, как сравнить 2 различия даты?

РЕДАКТИРОВАТЬ: datetime :: diff возвращает объект dateinterval, на самом деле он не реализует операторы сравнения, https://bugs.php.net/bug.php?id=49914 Я буду использовать переменные dateintervalпроверить разницу, спасибо за ответы

Ответы [ 6 ]

7 голосов
/ 04 января 2012

Кажется, что DateInterval не реализует функцию сравнения внутри. Расширениям разрешено определять собственные правила сравнения для своих предопределенных классов. Очевидно, это приводит к слабому сравнению, что объекты принадлежат к одному и тому же классу.

Запрос этой функции предоставляет исправление для добавления этой функции, но, похоже, он ни разу не попал в источник.

Чтобы обойти эту проблему, вы можете либо сравнить каждую переменную-член ваших объектов (годы, месяцы и т. Д.), Либо преобразовать каждый объект в массив:

if ((array) $interval == (array) $interval2) {
    echo 'true';
} else {
    echo 'false';
}
3 голосов
/ 04 января 2012

Вы только сравниваете, что два объекта & shy; Документы относятся к одному и тому же типу (и имеют одинаковое значение реквизита), но не к тождественны:

if ($interval === $interval2) {echo "true";} else {echo "false";}
              ^^^

Обратите внимание, что вы проводите сравнение объектов, а не сравнение значений, как со строкой.

2 голосов
/ 27 сентября 2012

Я расширил класс php.Метод сравнения делает сравнение значений.Он использует «естественный» порядок переменных в классе php DateInterval.Цикл foreach начинается сначала через годы, затем месяцы, затем дни и т. Д. Это, вероятно, не очень переносимое решение, но, похоже, оно отлично работает в PHP 5.3.

0 голосов
/ 08 августа 2012

Я сделал сравнение между двумя DateIntervals следующим образом:

version_compare(join('.', (array) $dateIntervalA), join('.', (array) $dateIntervalB));
0 голосов
/ 04 января 2012

Я помню, что есть функция для сравнения дат в php следующим образом.

compare_dates($start_date,$end_date); 
0 голосов
/ 04 января 2012

Вы присваиваете $ datetime1-> diff ($ datetime2) для $ interval и $ interval2, поэтому они имеют одинаковые значения

...