Порівняйте дату з сьогоднішньою


216

У мене є наступне

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

Я хотів би порівняти цю дату з сьогоднішньою датою (тобто, я хотів би знати, чи це $varраніше, чи дорівнює сьогодні чи ні)

Яку функцію мені потрібно використовувати?


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. Підсекундну частину просто ігнорують, враховуючи, що повернення є цілим числом із кількістю секунд.
Diogo Melo

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());
}

Чому дивна відстала логіка та сторонні булі? Чому б не просто "return strtotime ($ time) == strtotime ('today')", "return strtotime ($ time)> time ()" та "return strtotime ($ time) <time ()"?
Боббі Джек

@Bobby Jack: Я мав більше функцій у цих функціях, забув видалити зайвий код. Виправлено зараз.
Алікс Аксель

+1 на функцію помічника, конкретно цеPast b / c Я щойно запустив, if(strtotime('2013-01-22 00:00:00.00') < time()){....}і це зробив для мене.
MDMoore313

47

Щоб завершити BoBby Jack, використовуйте Object DateTime, якщо у вас є php 5.2.2+:

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

}

Це неправильно. Якщо $ 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)

* Зверніть увагу, що ===повертає помилку при порівнянні двох різних об'єктів 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

це не те, що моє $varдорівнює в ОП
alexus

1
І вам потрібен PHP> = 5,4 для (новий DateTime ()) -> формат ('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)

якщо $var є час часу на 00:00:00, як зазначено в ОП.

Замініть <=>на все, що вам потрібно (або збережіть так у php 7)

Крім того, очевидно, ми говоримо про однаковий часовий пояс для обох. Для списку підтримуваних TimeZones


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');
}

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
}

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;

і набагато більше;

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.