Сравните данную дату с сегодняшним днем

216

У меня есть следующие

$var = "2010-01-21 00:00:00.0"

Я хотел бы сравнить эту дату с сегодняшней датой (т.е. я хотел бы знать, если это $varдо сегодняшнего дня или равно сегодня или нет)

Какую функцию мне нужно использовать?

Alexus
источник
5
Я бы предложил также установить часовой пояс
NJInamdar

Ответы:

289
strtotime($var);

Превращает это в значение времени

time() - strtotime($var);

Дает вам секунды с $var

if((time()-(60*60*24)) < strtotime($var))

Проверим, если $varбыл в течение последнего дня.

Тайлер Картер
источник
1
для php 4 выйдите из последнего '.0' из $ var = "2010-01-21 00: 00: 00.0", иначе strtotime вернет -1
vivoconunxino
1
Я использую PHP 7.1. Подсекундная часть просто игнорируется, поскольку возвращаемое значение является целым числом с количеством секунд.
Диого Мело
209

Этот формат идеально подходит для стандартного сравнения строк, например

if ($date1 > $date2){
  //Action
}

Чтобы получить текущую дату в этом формате, просто используйте: date("Y-m-d H:i:s").

Так:

$today = date("Y-m-d H:i:s");
$date = "2010-01-21 00:00:00";

if ($date < $today) {}

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

Для правильного часового пояса вы можете использовать, например,

date_default_timezone_set('America/New_York');

Нажмите здесь, чтобы посмотреть доступные часовые пояса PHP.

Бобби Джек
источник
2
Это также игнорирует часовой пояс
anushr
@anushr, если часовой пояс необходим для сравнения, разницу времени можно добавить к дате перед сравнением. Это все еще быстрее, чем пытаться преобразовать две строки даты и времени в mm/dd/yyyyформат в дату и затем сравнить их. Меня всегда беспокоит, когда у разработчиков есть даты в нескольких часовых поясах в их системе. Я думаю, что лучше хранить даты в вашей системе, всегда в одном часовом поясе, а затем отображать их в любом необходимом часовом поясе. Я начал использовать yyyy-mm-ddформат (или yyyymmdd) в 1998 году, когда понял, что он сортируется намного быстрее, даже на SQL-сервере.
AaA
59

Ну вот:

function isToday($time) // midnight second
{
    return (strtotime($time) === strtotime('today'));
}

isToday('2010-01-22 00:00:00.0'); // true

Кроме того, еще несколько вспомогательных функций:

function isPast($time)
{
    return (strtotime($time) < time());
}

function isFuture($time)
{
    return (strtotime($time) > time());
}
Аликс Аксель
источник
Почему странная отсталая логика и посторонние логические выражения? Почему бы просто не "вернуть strtotime ($ time) == strtotime ('сегодня')", "вернуть strtotime ($ time)> time ()" и "вернуть strtotime ($ time) <time ()"?
Бобби Джек
@ Бобби Джек: у меня было больше функций в этих функциях, я забыл удалить лишний код. Исправлено сейчас.
Аликс Аксель
+1 на вспомогательную функцию, в частности isPast b / c Я только что запустил if(strtotime('2013-01-22 00:00:00.00') < time()){....}и это сделал для меня.
MDMoore313
47

Для завершения BoBby Jack, используйте DateTime OBject, если у вас php 5.2.2+:

if(new DateTime() > new DateTime($var)){
    // $var is before today so use it

}
kamakazuu
источник
Это не правильно. Если $ var - текущий день (после точной полуночи), новый DateTime () будет больше, чем новый DateTime ($ var), и это не так, $ var до сегодняшнего дня.
dxvargas
46

Вы можете использовать DateTimeкласс:

$past   = new DateTime("2010-01-01 00:00:00");
$now    = new DateTime();
$future = new DateTime("2021-01-01 00:00:00");

Операторы сравнения работают *:

var_dump($past   < $now);         // bool(true)
var_dump($future < $now);         // bool(false)

var_dump($now == $past);          // bool(false)
var_dump($now == new DateTime()); // bool(true)
var_dump($now == $future);        // bool(false)

var_dump($past   > $now);         // bool(false)
var_dump($future > $now);         // bool(true)

Также возможно получить значения меток времени из объектов DateTime и сравнить их:

var_dump($past  ->getTimestamp());                        // int(1262286000)
var_dump($now   ->getTimestamp());                        // int(1431686228)
var_dump($future->getTimestamp());                        // int(1577818800)
var_dump($past  ->getTimestamp() < $now->getTimestamp()); // bool(true)
var_dump($future->getTimestamp() > $now->getTimestamp()); // bool(true)

* Обратите внимание, что ===возвращает false при сравнении двух разных объектов DateTime, даже если они представляют одну и ту же дату.

Салман А
источник
$futureстало прошлым. : P
mbomb007
Мой, как летит время.
Салман
13
$toBeComparedDate = '2014-08-12';
$today = (new DateTime())->format('Y-m-d'); //use format whatever you are using
$expiry = (new DateTime($toBeComparedDate))->format('Y-m-d');

var_dump(strtotime($today) > strtotime($expiry)); //false or true
Hassan
источник
это не то, что мои $varравные тоже в OP
alexus
1
И вам нужен PHP> = 5.4 для (new DateTime ()) -> format ('Ym-d');
webrama.pl
6

Одно предупреждение, основанное на моем опыте, если ваша цель включает только дату, то будьте осторожны, чтобы включить метку времени . Например, скажем, сегодня "2016-11-09". Сравнение, включающее метку времени, аннулирует здесь логику. Пример,

//  input
$var = "2016-11-09 00:00:00.0";

//  check if date is today or in the future
if ( time() <= strtotime($var) ) 
{
    //  This seems right, but if it's ONLY date you are after
    //  then the code might treat $var as past depending on
    //  the time.
}

Код выше кажется правильным, но если это ТОЛЬКО дата, которую вы хотите сравнить, то приведенный выше код не является правильной логикой. Зачем? Потому что time () и strtotime () будут содержать метку времени. То есть, хотя обе даты приходятся на один и тот же день, разница во времени будет иметь значение. Рассмотрим пример ниже:

//  plain date string
$input = "2016-11-09";

Поскольку ввод является строкой с простой датой, использование strtotime()on $inputпредполагает, что это полночь 2016-11-09. Таким образом, бег в time()любое время после полуночи всегда будет лечить$input прошлым, даже если они в один и тот же день.

Чтобы это исправить, вы можете просто написать код, например так:

if (date("Y-m-d") <= $input)
{
    echo "Input date is equal to or greater than today.";
}
Линнелл Эммануэль Нери
источник
1
Я уверен, что ОП рассмотрел это, и поэтому они включили в свой вопрос «00: 00: 00.0»
AaA
6

Несколько лет спустя я повторяю наблюдение Бобби Джека, что последние 24 часа не сегодня !!! И я удивлен, что за ответ было столько голосов ...

Для сравнения, если определенная дата меньше, равна или больше другой, сначала вам нужно повернуть их «вниз» к началу дня. Другими словами, убедитесь, что вы говорите об одном и том же времени 00:00:00 в обеих датах. Это может быть просто и элегантно сделано как:

strtotime("today") <=> strtotime($var)

if $varимеет часть времени в 00:00:00, как указано в OP.

замещать <=> все, что вам нужно (или оставьте это в php 7)

Кроме того, очевидно, что мы говорим об одном и том же часовом поясе для обоих. Для списка поддерживаемых часовых поясов

Нелу Бидонелу
источник
5
$date1=date_create("2014-07-02");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);

(пример w3schools, он отлично работает)

Ричард де Ри
источник
4

Расширяя ответ Джосуа от w3schools:

//create objects for the dates to compare
$date1=date_create($someDate);
$date2=date_create(date("Y-m-d"));
$diff=date_diff($date1,$date2);
//now convert the $diff object to type integer
$intDiff = $diff->format("%R%a");
$intDiff = intval($intDiff);
//now compare the two dates
if ($intDiff > 0)  {echo '$date1 is in the past';}
else {echo 'date1 is today or in the future';}

Надеюсь, это поможет. Мой первый пост на stackoverflow!

Энцелад
источник
1

Сравните объекты даты и времени:

(Я выбрал 10 дней - все, что старше 10 дней, это «СТАРЫЙ», иначе «НОВЫЙ»)

$now   = new DateTime();
$diff=date_diff($yourdate,$now);
$diff_days = $diff->format("%a");
if($diff_days > 10){
    echo "OLD! " . $yourdate->format('m/d/Y');
}else{
    echo "NEW! " . $yourdate->format('m/d/Y');
}
Kevin
источник
1

Некоторые из приведенных ответов не учитывают текущий день!

Вот мое предложение.

$var = "2010-01-21 00:00:00.0"
$given_date = new \DateTime($var);

if ($given_date == new \DateTime('today')) {
  //today
}

if ($given_date < new \DateTime('today')) {
  //past
}

if ($given_date > new \DateTime('today')) {
  //future
}
dxvargas
источник
0

Если вы делаете вещи со временем и датами Carbon - ваш лучший друг;

Установите пакет тогда:

$theDay = Carbon::make("2010-01-21 00:00:00.0");

$theDay->isToday();
$theDay->isPast();
$theDay->isFuture();
if($theDay->lt(Carbon::today()) || $theDay->gt(Carbon::today()))

lt = меньше чем, gt = больше чем

Как в вопросе:

$theDay->gt(Carbon::today()) ? true : false;

и многое другое;

Лукас М. Оливейра
источник