Я обнаружил, что объект DateTime в PHP можно сравнивать с другим, поскольку операторы ">" и "<" перегружены.
То же самое и с DateInterval?
Когда я пытался ответить на этот вопрос, я обнаружил кое-что странное:
<?php
$today = new DateTime();
$release = new DateTime('14-02-2012');
$building_time = new DateInterval('P15D');
var_dump($today->diff($release));
var_dump($building_time);
var_dump($today->diff($release)>$building_time);
var_dump($today->diff($release)<$building_time);
if($today->diff($release) < $building_time){
echo 'oK';
}else{
echo 'Just a test';
}
Всегда звучит эхо "Just a test". Выходные данные var_dump:
object(DateInterval)#4 (8) {
["y"]=>
int(0)
["m"]=>
int(0)
["d"]=>
int(18)
["h"]=>
int(16)
["i"]=>
int(49)
["s"]=>
int(19)
["invert"]=>
int(1)
["days"]=>
int(18)
}
object(DateInterval)#3 (8) {
["y"]=>
int(0)
["m"]=>
int(0)
["d"]=>
int(15)
["h"]=>
int(0)
["i"]=>
int(0)
["s"]=>
int(0)
["invert"]=>
int(0)
["days"]=>
bool(false)
}
bool(false)
bool(true)
Когда я пытаюсь использовать DateTime как «01-03-2012», все работает.
Я использовал следующий обходной путь, сравнивая DateIntervals:
version_compare(join('.', (array) $dateIntervalA), join('.', (array) $dateIntervalB));
Короче говоря, сравнение объектов DateInterval
в настоящее время не поддерживается по умолчанию (с php 5.6).
Как вы уже знаете, объекты DateTime
сравнимы.
Способ достижения желаемого результата состоит в том, чтобы вычесть или добавить DateInterval
из объекта DateTime
и сравнить их, чтобы определить разницу.
Пример: https://3v4l.org/XeSJe
$buildDate = new DateTime();
$releaseDate = clone $buildDate;
$releaseDate->modify('2012-02-14');
$buildDate->add(new DateInterval('P15D'));
var_dump($releaseDate < $buildDate); //bool(true)
Редактировать
По состоянию на выпуск В PHP 7.1 результаты отличаются от результатов в PHP 5.x из-за добавленной поддержки микросекунд с.
Пример: https://3v4l.org/rCigC
$a = new \DateTime;
$b = new \DateTime;
var_dump($a < $b);
Результаты (7,1 +) :
bool(true)
Результаты (5.x - 7.0.x, 7.1.3) :
bool(false)
Чтобы обойти это поведение, рекомендуется использовать clone
для сравнения DateTime
объекты вместо.
Пример: https://3v4l.org/CSpV8
$a = new \DateTime;
$b = clone $a;
var_dump($a < $b);
Результаты (5.x - 7.x) :
bool(true)
Нет, сейчас это невозможно и никогда не будет. Существует фундаментальная проблема при сравнении двух DateInterval
.
DateInterval
относительна, а DateTime
абсолютна: P1D
означает 1 день, так что вы можете подумать, что это означает (24 * 60 * 60) 86.400 секунд Но из-за Leap Second это не всегда так.
Это выглядит как редкая ситуация, не забудьте сравнить месяцы с днями еще сложнее:
P1M и P30D - какая из них больше? это P1M, хотя я сейчас нахожусь в феврале? Или это P30D, хотя я сейчас в августе? А как насчет PT24H30M и P1D? https://bugs.php.net/bug.php?id=49914#1490336933