Як я можу порівняти дві дати в PHP?


125

Як я можу порівняти дві дати в PHP?

Дата зберігається в базі даних у наступному форматі

2011-10-2

Якби я хотів порівняти сьогоднішню дату з датою в базі даних, щоб побачити, яка з них більша, як би це зробити?

Я спробував це,

$today = date("Y-m-d");
$expire = $row->expireDate //from db

if($today < $expireDate) { //do something; }

але це насправді не працює таким чином. Який ще спосіб зробити це?


Призначте дату db об’єкту DateTime, а потім порівняйте ці об'єкти. Приємний приклад ви можете знайти в stackoverflow.com/questions/961074/…
Пітер

Відповіді:


80

дата в базі даних виглядає приблизно такою 2011-10-2

Зберігайте його у YYYY-MM-DD і тоді порівняння рядків буде працювати, оскільки '1'> '0' тощо.


2
але що робити, якщо вони виглядають так, 2011-10-02 та 2012-02-10, для порівняння місяця 1> 0, але 2011-10-02 <2012-02-10
dav

14
@Davo, порівняння зупиняється на першому символі, який відрізняється. У цьому випадку четверта цифра '1' <'2', тож ви отримаєте очікуваний результат.
Метью

1
Вибачте :), був недостатньо обережним.
дав

буде працювати наступна робота 2016-03-27 11:59:47 ::: 2016-03-14 10:30:00?
shorif2000

221

Якщо всі ваші дати припадають на 1 січня 1970 року, ви можете використовувати щось на кшталт:

$today = date("Y-m-d");
$expire = $row->expireDate; //from database

$today_time = strtotime($today);
$expire_time = strtotime($expire);

if ($expire_time < $today_time) { /* do Something */ }

Якщо ви використовуєте PHP 5> = 5.2.0, ви можете використовувати клас DateTime:

$today_dt = new DateTime($today);
$expire_dt = new DateTime($expire);

if ($expire_dt < $today_dt) { /* Do something */ }

Або щось у цьому напрямку.


Якщо я пам'ятаю правильно, турбота стосується 1st of January of 1970лише старих версій PHP, що працюють в Windows, і це ніколи не було проблемою в Unix.
Альваро Гонсалес

Мені подобається ця відповідь. Це чудовий вибір перетворення дат у strtotime ()
Еріх Гарсія

2
Чи не було б зараз "Якби всі ваші дати припадали на 1 січня 1970 року" та "попередні до 2038 року"? стежте за нашими помилками y2k38. strtotimeповерне помилкові для більших дат. stackoverflow.com/questions/2012589 / ...
blamb

Зауважимо, що DateTimeспосіб є кращим методом. Цей об'єкт може зробити набагато більше, ніж strtotimeколи-небудь міг.
Machavity

new DateTime('now')також працює над тим, щоб знайти сьогоднішню дату
Брейт

23

Просто для компліменту вже даним відповідям дивіться наступний приклад:

$today = new DateTime('');
$expireDate = new DateTime($row->expireDate); //from database



if($today->format("Y-m-d") < $expireDate->format("Y-m-d")) { 
    //do something; 
}

Оновлення: або просто використовувати функцію old-school date () :

if(date('Y-m-d') < date('Y-m-d', strtotime($expire_date))){
    //echo not yet expired! 
}   

1
Дата - це функція, а не клас / конструктор.
spdionis

2
@spdionis дякую за коментар, я змінив велику літеру, щоб усунути можливу плутанину.
д.раєв

6

Я б не робив цього з PHP. База даних повинна знати, який день сьогодні (наприклад, використовуйте MySQL-> ЗАРАЗ ()), тому порівняти в межах Запиту буде дуже просто і повернути результат без проблем залежно від використовуваних типів дати

SELECT IF(expireDate < NOW(),TRUE,FALSE) as isExpired FROM tableName

дякую, але я насправді використовую дату () я не зберігаю сьогоднішню дату в
небі

4
Але ви зберігаєте expireDate в db. Порівняйте цю дату ЗАРАЗ ()
Dr.Molle

4
$today = date('Y-m-d');//Y-m-d H:i:s
$expireDate = new DateTime($row->expireDate);// From db 
$date1=date_create($today);
$date2=date_create($expireDate->format('Y-m-d'));
$diff=date_diff($date1,$date2);

//echo $timeDiff;
if($diff->days >= 30){
    echo "Expired.";
}else{
    echo "Not expired.";
}

2

Ось спосіб, як отримати різницю між двома датами в хвилинах.

// set dates
$date_compare1= date("d-m-Y h:i:s a", strtotime($date1));
// date now
$date_compare2= date("d-m-Y h:i:s a", strtotime($date2));

// calculate the difference
$difference = strtotime($date_compare1) - strtotime($date_compare2);
$difference_in_minutes = $difference / 60;

echo $difference_in_minutes;

Питання вимагає порівняння двох дат - у вашій відповіді додається багато зайвих матеріалів (тобто встановлення статусу в режимі онлайн / офлайн), що не потрібно як відповідь на питання. Частина вашої відповіді , де порівняння займає місця практично такі ж , як уже існуючу відповідь тут .
crazyloonybin

Оновлено запитання, я опублікував неправильну відповідь у неправильному запитанні ^^;) Це не те саме, що відповідь, просто додавши свої дані про те, як їх порівняти та отримати різницю в хвилинах.
Сино

1
Я вилучив свій голос через ваше оновлення, зараз виглядає набагато краще :)
crazyloonybin

2

Ви можете конвертувати дати в часові позначки UNIX і порівняти різницю між ними в секундах.

$today_date=date("Y-m-d");
$entered_date=$_POST['date'];
$dateTimestamp1 = strtotime($today_date);
$dateTimestamp2 = strtotime($entered_date);
$diff= $dateTimestamp1-$dateTimestamp2;
//echo $diff;
if ($diff<=0)
   {
     echo "Enter a valid date";
   }

0

У мене була і ця проблема, і я її вирішую:

$today = date("Ymd");
$expire = str_replace('-', '', $row->expireDate); //from db

if(($today - $expire) > $NUMBER_OF_DAYS) 
{ 
    //do something; 
}

Чому ця методика працює, слід пояснити у відповіді.
mickmackusa

Будь ласка, дайте відповідь на розміщене питання ОП, а не як ви вирішили свій унікальний сценарій.
mickmackusa

0

Ось мій спін про те, як отримати різницю в днях між двома датами за допомогою PHP. Зверніть увагу на використання "!" у форматі, щоб відкинути часову частину дат, завдяки інформації з DateTime createFromFormat без часу .

$today = DateTime::createFromFormat('!Y-m-d', date('Y-m-d'));
$wanted = DateTime::createFromFormat('!d-m-Y', $row["WANTED_DELIVERY_DATE"]);
$diff = $today->diff($wanted);
$days = $diff->days;
if (($diff->invert) != 0) $days = -1 * $days;
$overdue = (($days < 0) ? true : false);
print "<!-- (".(($days > 0) ? '+' : '').($days).") -->\n";

-1

Знайшов відповідь в блозі, і це так просто, як:

strtotime(date("Y"."-01-01")) -strtotime($newdate))/86400

І ви отримаєте дні між двома датами.


Здається, це вирішує іншу проблему. Будь ласка, відповідайте лише на запитання ОП.
mickmackusa

-1

Це працює завдяки логіці порівняння рядків PHP. Просто ви можете перевірити ...

if ($startdate < $date) {// do something} 
if ($startdate > $date) {// do something}

Обидві дати повинні бути в одному форматі. Цифри повинні бути зафіксовані з нуля ліворуч і впорядковані від найбільш значущих до найменш значущих. Y-m-dі Y-m-d H:i:sзадовольнити ці умови.


1
d-m-Yне працюватиме Y-m-d(з таким нульовим рівнем, як 2016-05-08) буде працювати. Перевірте ці дати у d-m-Yформаті 01-10-2016і 20-02-2016, порівнюючи як рядки 0 <2, він перестане порівнювати, але неправильно ...
Arxeiss

Ось доказ того, що ваша техніка не зможе правильно порівняти дати ОП з сьогоднішньою датою: 3v4l.org/SNHKT
mickmackusa

ОП має інший формат дати. дата виглядає так 2011-10-2.
mickmackusa

-1

Якщо ви хочете, щоб дата ($ дата) закінчилася, через деякий інтервал, наприклад, дата закінчення терміну дії лексеми під час скидання пароля, ось як це зробити:

$date = $row->expireDate;

$date->add(new DateInterval('PT24H')); // adds 24 hours

$now = new \DateTime();

if($now < $date) { /* expired after 24 hours */ }

Але у вашому випадку ви можете зробити порівняння так само:

$today = new DateTime('Y-m-d');

$date = $row->expireDate;

if($today < $date) { /* do something */ }

Ця відповідь ігнорує спочатку розміщене запитання. Будь ласка, використовуйте зразки даних, надані ОП.
mickmackusa

Не зовсім те, що хлопець просить про допомогу, але я думав, що цей спосіб може допомогти, якщо хтось зрозуміє принципи.
faye.babacar78

Я розумію принципи, але цей код не відповідає на поставлене запитання. Ця сторінка вже переповнена неправильними і незв'язаними відповідями - це лише бентежить дослідників і марнує їх час. Я намагаюся доглядати за дослідниками.
mickmackusa

Я думаю, що це не так складно, він міг би використовувати клас DateTime () замість функції date (). Відповідь, яку я виклав вище, полягає в тому, щоб якось дати ідеї дослідникам.
faye.babacar78

1
Я перестану повторюватися і відключитися від цієї дискусії. Друге найвище рішення ( stackoverflow.com/a/3847762/2943403 ) демонструє жахливо простий (неперевершений) спосіб створення двох об'єктів дати. Я абсолютно не маю уявлення, чим requestDate()займається ваш магічний метод - ніде про нього не згадується. Я б не використовував вашу відповідь, а також не рекомендував би будь-який дослідник використовувати ваше рішення. Я не передбачаю, що я міняю свій голос.
mickmackusa

-2

Перш за все, спробуйте надати потрібний формат поточному часу вашого сервера:

  1. Отримати поточний час дати

    $ current_date = getdate ();

  2. Окремі дати та час, щоб ними керувати:

$ current_date_only = $ current_date [рік] .'- '. $ current_date [пн] .'-'. $ current_date [mday]; $ current_time_only = $ current_date ['годин']. ':'. $ current_date ['хвилин']. ':'. $ current_date ['секунди'];

  1. Порівняйте це залежно від того, якщо ви використовуєте дату чи дату у вашому БД:

    $ сьогодні = $ current_date_only. ' '. $ current_time_only;

    або

    $ сьогодні = $ current_date_only;

    if ($ сьогодні <$ expireDate)

сподіваюся, що це допомагає


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