Как сравнить два объекта DateTime в PHP 5.2.8?

259

Это похоже на что-то, что должно быть довольно прямолинейным, но я застрял на странице с этой проблемой какое-то время, так что вот здесь.

Взглянув на документацию PHP, следующие два метода объекта DateTime, похоже, решат мою проблему:

  • DateTime:: diff: получите разницу и используйте это, чтобы определить, что является более древним.
  • DateTime:: getTimestamp: Получите временную метку UNIX и сравните ее.

Оба эти метода отмечены в doco как доступные в версии >= 5.3 (и, что не удивительно, если я попытаюсь их назвать Я считаю, что они не существуют). Я не могу найти какую-либо конкретную документацию для 5.2.8, поэтому я не уверен, есть ли в моей версии эквивалентные методы. У меня Googled проблема и нашел эклектичный диапазон решений, ни один из которых не отвечает моим очень простым требованиям:

  • Как сравнить два объекта DateTime?
  • Где я могу найти doco для предыдущих версий PHP? В частности, версия 5.2.8?

В некотором контексте у меня есть следующий код:

$st_dt = new DateTime(verifyParam ('start_date'));
$end_dt = new DateTime(verifyParam ('end_date'));

// is the end date more ancient than the start date?
if ($end_dt < $start_dt) 

По-видимому, на этом парне нет оператора сравнения.

EDIT: По-видимому, мои предположения были полностью ложными (спасибо Милену за это очень хорошо иллюстрирует). Существует оператор сравнения, и он отлично работает. Иногда мне очень не хватает компилятора. Ошибка в коде выше, я уверен, что вы найдете его намного быстрее, чем я:).

Я с нетерпением жду моего смущения по простоте вашего решения.

EDIT: И, конечно же, возникает смущение...

  • 1
    Что касается отсутствия компилятора - установите «error_reporting» на «E_ALL», и вы получите уведомления типа «Notice: Undefined variable: start_dt in ...».
  • 0
    Ура Милен, я сделаю это.
Показать ещё 3 комментария
Теги:
datetime

7 ответов

350
Лучший ответ

Ниже показано, что существуют следующие операторы сравнения для класса DateTime:

dev:~# php
<?php
date_default_timezone_set('Europe/London');

$d1 = new DateTime('2008-08-03 14:52:10');
$d2 = new DateTime('2008-01-03 11:11:10');
var_dump($d1 == $d2);
var_dump($d1 > $d2);
var_dump($d1 < $d2);
?>
bool(false)
bool(true)
bool(false)
dev:~# php -v
PHP 5.2.6-1+lenny3 with Suhosin-Patch 0.9.6.2 (cli) (built: Apr 26 2009 20:09:03)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
dev:~#
  • 7
    Спасибо, Милен, похоже, мне просто нужно было удалить мои ложные предположения, и внезапно для меня стала очевидна явная ошибка в моем коде.
  • 2
    Хм, это интересно. Возможно, в какой-то момент мы сможем перегрузить операторы в пользовательских классах.
Показать ещё 7 комментариев
33

Из официальной документации:

Начиная с PHP 5.2.2, объекты DateTime можно сравнить с помощью операторов сравнения.

$date1 = new DateTime("now");
$date2 = new DateTime("tomorrow");

var_dump($date1 == $date2); // false
var_dump($date1 < $date2); // true
var_dump($date1 > $date2); // false

Для версий PHP до 5.2.2 (фактически для любой версии) вы можете использовать diff.

$datetime1 = new DateTime('2009-10-11'); // 11 October 2013
$datetime2 = new DateTime('2009-10-13'); // 13 October 2013

$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days'); // +2 days
  • 2
    Я считаю этот ответ лучшим, поскольку он цитирует руководство, а не просто проверяет поведение и предполагает, что результат соответствует ожидаемому. ТАК не место для догадок. Браво Роберто.
  • 2
    @roberto DateTime :: diff был добавлен только в PHP 5.3
29

Вы также можете сравнить секунды секунд:

$d1->format('U') < $d2->format('U')

Источник: http://laughingmeme.org/2007/02/27/looking-at-php5s-datetime-and-datetimezone/ (довольно интересная статья о DateTime)

Показать ещё 4 комментария
18

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

$d1->format("Y-m-d") == $d2->format("Y-m-d")
  • 4
    Вы также можете установить время сброса. $d1->setTime(0, 0, 0);
0

Начиная с PHP 7.x вы можете использовать следующее:

$aDate = new \DateTime('@'.(time()));
$bDate = new \DateTime('@'.(time() - 3600));

$aDate <=> $bDate; // => 1, '$aDate' is newer than '$bDate'
0
$elapsed = '2592000';
// Time in the past
$time_past = '2014-07-16 11:35:33';
$time_past = strtotime($time_past);

// Add a month to that time
$time_past = $time_past + $elapsed;

// Time NOW
$time_now = time();

// Check if its been a month since time past
if($time_past > $time_now){
    echo 'Hasnt been a month';    
}else{
    echo 'Been longer than a month';
}
  • 0
    временная метка имеет некоторые ограничения, вы можете прочитать этот stackoverflow.com/a/7229760/2652018
  • 0
    Приятно знать! Это было просто для простого сравнения времени.
0

Это может вам помочь.

$today = date("m-d-Y H:i:s");
$thisMonth =date("m");
$thisYear = date("y");
$expectedDate = ($thisMonth+1)."-08-$thisYear 23:58:00";


if (strtotime($expectedDate) > strtotime($today)) {
    echo "Expected date is greater then current date";
    return ;
} else
{
 echo "Expected date is lesser then current date";
}
  • 0
    временная метка имеет некоторые ограничения, вы можете прочитать этот stackoverflow.com/a/7229760/2652018
  • 0
    @SteelBrain Как вы думаете, что ограничение временной отметки беспокоит вышеуказанный код, который имеет всю текущую дату, пожалуйста, прочитайте код еще раз, это в основном проверка парня $ Ожидаемая дата, которая всегда будет в текущем месяце. Я не думаю, что мы должны думать об ограничении отметки времени здесь в этом случае.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню