Являются ли PHP DateInterval сопоставимыми с DateTime?

Я обнаружил, что объект 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», все работает.

27
задан artragis 9 January 2018 в 09:37
поделиться

3 ответа

Я использовал следующий обходной путь, сравнивая DateIntervals:

version_compare(join('.', (array) $dateIntervalA), join('.', (array) $dateIntervalB));
-3
ответ дан 28 November 2019 в 05:40
поделиться

Короче говоря, сравнение объектов 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)
13
ответ дан 28 November 2019 в 05:40
поделиться

Нет, сейчас это невозможно и никогда не будет. Существует фундаментальная проблема при сравнении двух 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

4
ответ дан 28 November 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: