Проверьте, установлены ли два объекта datetime PHP на одну дату (игнорируя время)

Я просто хочу сравнить 2 объекта datetime, чтобы узнать, установлены ли они на одну дату, но меня не интересует компонент времени объекта. В настоящий момент я использую команду date_format для извлечения строк, таких как «Ymd», но это кажется неудобным.

$firstDate = date_format($firstDateTimeObj, 'Ym-d'); $secondDate = date_format($secondDateTimeObj, 'Ym-d'); if !($firstDate == $secondDate) { // some code } 

Я новичок в программировании и PHP, поэтому любые указатели оценили.

Используйте синтаксис объекта!

 $firstDate = $firstDateTimeObj->format('Ym-d'); $secondDate = $secondDateTimeObj->format('Ym-d'); 

Вы были очень близки к вашему выражению if, но! оператор должен находиться в круглой скобке.

 if (!($firstDate == $secondDate)) 

Это также можно выразить как

 if ($firstDate != $secondDate) 

Мой первый ответ был совершенно неправильным, поэтому я начинаю новый.

Самый простой способ, как показано в других ответах, – date_format . Это почти наверняка путь. Однако есть и другой способ, который использует всю полноту классов DateTime. Используйте diff для создания экземпляра DateInterval , затем проверьте его свойство d : если оно равно 0 , это тот же день.

 // procedural $diff = date_diff($firstDateTimeObj, $secondDateTimeObj); // object-oriented $diff = $firstDateTimeObj->diff($secondDateTimeObj); if ($diff->format('%a') === '0') { // do stuff } else { // do other stuff } 

Обратите внимание, что это почти наверняка излишним для этого экземпляра, но это может быть полезной техникой, если вы захотите сделать более сложные вещи в будущем.

Я думаю, что ваш подход хорош, но я бы удалил - как они ничего не добавляют.

 $firstDate = date_format($firstDateTimeObj, 'Ymd'); $secondDate = date_format($secondDateTimeObj, 'Ymd'); if ($firstDate != $secondDate) { // some code } 

Это отлично поработало для меня.

 $date1=DateTime::createFromFormat('Ymd H:i:s', '2014-07-31 07:30:00')->format('Ym-d'); $date2=DateTime::createFromFormat('Ymd H:i:s', '2014-08-01 17:30:00')->format('Ym-d'); if($date1==$date2){ echo "=="; }else{ echo "!="; } 

Поиск ответа с той же проблемой. Я пришел к этому решению, которое выглядит лучше для меня, а затем использует diff или другие вещи.

Основная проблема заключалась в игнорировании временных частей объекта DateTime, просто установите его на время, например, в 12:00:00

 $firstDateTimeObj->setTime(12, 0, 0); $secondDateTimeObj->setTime(12, 0, 0); // The main problem was checking if different.. but you can use any comparison if ($firstDateTimeObj != $secondDateTimeObj) { } 

Инициализируйте объект DateTime и установите время до 00:00:00 . Затем вы можете использовать любое сравнение между датами, игнорирующими время:

 $today = \DateTime::createFromFormat('d/m/YH:i:s', '21/08/2014 00:00:00'); $tomorrow = \DateTime::createFromFormat('d/m/YH:i:s', '22/08/2014 00:00:00'); // now you can compare them just with dates var_dump($today < $tomorrow); //true var_dump($today === $tomorrow); //false var_dump($today !== $tomorrow); //true 

Ответ @ Evert работает нормально, но похоже, что неправильно преобразовать объект DateTime в строку и затем сравнить их.

Быстрое и грязное, многоразовое, но не проверенное, может все еще нуждаться в некоторой корректировке:

 $data[] = strtotime(date_format($firstDateTimeObj, 'Ym-d')); $data[] = strtotime(date_format($secondDateTimeObj, 'Ym-d')); if(sameDate($data)) { // your code } function sameDate ((array) $array) { foreach($array as $item) { $test[$item] = $item; } if(count($test) > 1) { return false; { else { return true; } } 

strtotime конвертирует текстовую дату в метку времени Unix: http://fr.php.net/manual/en/function.strtotime.php

 $first = strtotime(date_format($firstDateTimeObj, 'Ym-d')); $second = strtotime(date_format($secondDateTimeObj, 'Ym-d')); if ($first != $second) { // some code } 

А также :

 if ($first > $second) { // some code } if ($first < $second) { // some code } 
 $first = strtotime(date_format($firstDateTimeObj, 'Ym-d')); $second = strtotime(date_format($secondDateTimeObj, 'Ym-d')); if ($first != $second) { // some code }