Как сравнить два объекта DateTime в PHP 5.2.8?
Это кажется чем-то, что должно быть довольно простым, но я застрял на странице, порождая эту проблему некоторое время, так что здесь.
Взглянув на документацию PHP, следующие два метода объекта DateTime могут решить мою проблему:
Оба эти метода отмечены в документе как доступные в версии> = 5.3 (и, что неудивительно, если я попытаюсь вызвать их, я обнаружу, что они не существуют). Я не могу найти какую-либо конкретную документацию для 5.2.8, поэтому я не уверен, есть ли в моей версии эквивалентные методы. Я гуглил проблему и нашел эклектичный диапазон решений, ни одно из которых не отвечает моим очень простым требованиям:
- Как сравнить два объекта DateTime?
- Где я могу найти документацию для предыдущих версий 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)
Видимо, на этом парне нет оператора сравнения.
редактировать
Видимо, мои предположения были полностью ложными (спасибо Милен за столь эффективную иллюстрацию). Есть оператор сравнения, и он работает просто отлично, спасибо. Иногда я действительно скучаю по компилятору. Ошибка в приведенном выше коде, я уверен, вы найдете ее намного быстрее, чем я :).
Ответы
Ответ 1
Ниже показано, что существуют следующие операторы сравнения для класса 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:~#
Ответ 2
Из официальной документации:
Начиная с 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
Ответ 3
Вы также можете сравнить секунды секунд:
$d1->format('U') < $d2->format('U')
Источник: http://laughingmeme.org/2007/02/27/looking-at-php5s-datetime-and-datetimezone/
(довольно интересная статья о DateTime)
Ответ 4
Если вы хотите сравнить даты, а не время, вы можете использовать это:
$d1->format("Y-m-d") == $d2->format("Y-m-d")
Ответ 5
Это может вам помочь.
$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";
}
Ответ 6
$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';
}
Ответ 7
Начиная с PHP 7.x вы можете использовать следующее:
$aDate = new \DateTime('@'.(time()));
$bDate = new \DateTime('@'.(time() - 3600));
$aDate <=> $bDate; // => 1, '$aDate' is newer than '$bDate'