Я просто хочу сравнить 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 }