Проверьте, установлены ли два объекта даты и времени PHP на одну и ту же дату (игнорируя время) - PullRequest
42 голосов
/ 30 ноября 2011

Я просто хочу сравнить 2 объекта даты и времени, чтобы увидеть, установлены ли они на одну и ту же дату, но мне не важен компонент времени объекта. В настоящее время я использую команду date_format для извлечения строк типа 'Y-m-d' для сравнения, но это кажется неудобным.

$firstDate = date_format($firstDateTimeObj, 'Y-m-d');
$secondDate = date_format($secondDateTimeObj, 'Y-m-d');

if !($firstDate == $secondDate) {

// some code
}

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

Ответы [ 10 ]

54 голосов
/ 30 ноября 2011

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

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

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

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

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

if ($firstDate != $secondDate)
14 голосов
/ 30 ноября 2011

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

Самый простой способ, как показано в других ответах, - это 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
}

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

10 голосов
/ 30 ноября 2011

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

$firstDate = date_format($firstDateTimeObj, 'Ymd');
$secondDate = date_format($secondDateTimeObj, 'Ymd');

if ($firstDate != $secondDate) {
    // some code
}
5 голосов
/ 22 июня 2017

Поиск ответа с той же проблемой .. Я пришел к этому решению, которое выглядит лучше для меня, чем использовать 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) {
}
4 голосов
/ 16 июля 2014

Это прекрасно сработало для меня.

$date1=DateTime::createFromFormat('Y-m-d H:i:s', '2014-07-31 07:30:00')->format('Y-m-d');
$date2=DateTime::createFromFormat('Y-m-d H:i:s', '2014-08-01 17:30:00')->format('Y-m-d');
if($date1==$date2){
    echo "==";
}else{
    echo "!=";
}
1 голос
/ 08 марта 2019

Ищите здесь тот же вопрос и придумали другой способ сделать это.Довольно кратко:

$diff = date_diff($date1,$date2);
if ($diff->days == '0') {
  /* it's the same date */
}

Сначала получите объект date_interval, используя date_diff.У объекта date_interval есть свойство 'days', которое вы можете использовать для получения общего количества дней между двумя датами.

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

0 голосов
/ 06 декабря 2017

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

обновление: менее грязное.

if(sameDate($firstDateTimeObj, $secondDateTimeObj, $ThirdDateTimeObj))
{
   // your code

}

function sameDate (DateTime ...$dates) {

   foreach($dates as $date)
   {
      $test[] = $date->format('Ymd');
   }

   $result = array_unique($test);

   if(count($result) == 1)
   {
      return true;
   {

   return false;

}
0 голосов
/ 21 августа 2014

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

$today = \DateTime::createFromFormat('d/m/Y H:i:s', '21/08/2014 00:00:00');
$tomorrow = \DateTime::createFromFormat('d/m/Y H: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

@ Ответ Эверта работает отлично, но выглядит неправильным преобразовать объект DateTime в строку и затем сравнить их.

0 голосов
/ 30 ноября 2011
$first = strtotime(date_format($firstDateTimeObj, 'Y-m-d'));
$second = strtotime(date_format($secondDateTimeObj, 'Y-m-d'));

if ($first != $second) {
    // some code
}
0 голосов
/ 30 ноября 2011

время преобразования текстовой даты в метку времени Unix: http://fr.php.net/manual/en/function.strtotime.php

$first = strtotime(date_format($firstDateTimeObj, 'Y-m-d'));
$second = strtotime(date_format($secondDateTimeObj, 'Y-m-d'));

if ($first != $second) {

// some code
}

А также:

if ($first > $second) {
// some code
}

if ($first < $second) {
// some code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...