Как я могу проверить, не прошло ли текущая дата / время за установленную дату / время?

115

Я пытаюсь написать сценарий, который будет проверять, прошло ли текущее время / дата 05/15/2010 at 4PM

Как я могу использовать функцию PHP date () для выполнения этой проверки?

Дейв
источник

Ответы:

228

Начиная с PHP> = 5.2.2, вы можете использовать DateTimeкласс как таковой:

if (new DateTime() > new DateTime("2010-05-15 16:00:00")) {
    # current time is greater than 2010-05-15 16:00:00
    # in other words, 2010-05-15 16:00:00 has passed
}

Строка, переданная конструктору DateTime, анализируется в соответствии с этими правилами .


Обратите внимание, что также можно использовать timeи strtotimefunctions. См. Исходный ответ .

Салман А
источник
6
timestamp имеет некоторые ограничения, а также некоторые ошибки, например, временная метка не может обрабатывать дату до 1970 года и после 2038 года (см. ответ Ивара Костера)
Steel Brain
1
Мы часто видим злоупотребление new DateTime () без параметра, если вы используете даты в формате UTC (как и следовало бы), предпочитаете использовать new DateTime («сейчас», new DateTimeZone ('UTC')). Это предотвратит появление в вашем приложении непонятных ошибок в датах. Я советую вам хранить его в статической переменной функции, статическом классе или где-нибудь еще в вашем рабочем процессе ...
Лоеникс,
Что, если у нас уже есть объект DateTime и мы хотим знать, прошло ли оно, поскольку мы не можем передать объект конструктору DateTime, как вы предложили? должны ли мы использовать его getTimestamp () и сравнивать его с time ()? @Salman A
user4271704
@ user4271704 Это new DateTime('2010-05-15')просто пример, это может быть любой объект DateTime, который вы инициализировали ранее.
Salman A
Предполагая, $objectчто это объект DateTime, я использовал, if (new DateTime() > $object) {}и он работает неправильно. Но if (time() > $bject->getTimeStamp()) {}работает правильно. @Salman A
user4271704
77

Также существует класс DateTime, который реализует функцию для операторов сравнения.

// $now = new DateTime();
$dtA = new DateTime('05/14/2010 3:00PM');
$dtB = new DateTime('05/14/2010 4:00PM');

if ( $dtA > $dtB ) {
  echo 'dtA > dtB';
}
else {
  echo 'dtA <= dtB';
}
VolkerK
источник
1
Какие функции он выполняет для этого?
still_dreaming_1 02
6

Проверьте strtotimeфункцию PHP, чтобы преобразовать установленную дату / время в метку времени: http://php.net/manual/en/function.strtotime.php

Если strtotimeвы не можете правильно обработать ваш формат даты / времени («16:00 PM», вероятно, будет работать, но не «в 4PM»), вам необходимо использовать строковые функции, например, substrчтобы проанализировать / исправить ваш формат и получить метку времени через другая функция, например mktime.

Затем сравните полученную метку времени с текущей датой / временем (if ($calulated_timestamp > time()) { /* date in the future */ } ), чтобы увидеть, находится ли установленная дата / время в прошлом или в будущем.

Я предлагаю прочитать PHP-документ о функциях даты / времени и вернуться сюда с некоторыми исходными кодами, когда вы застряли.

Select0r
источник
см. ответ Ивара Костера
Steel Brain
1
date_default_timezone_set('Asia/Kolkata');

$curDateTime = date("Y-m-d H:i:s");
$myDate = date("Y-m-d H:i:s", strtotime("2018-06-26 16:15:33"));
if($myDate < $curDateTime){
    echo "active";exit;
}else{
    echo "inactive";exit;
}
Ракеш Кумар Прадхан
источник
Наверняка это не сработает как $myDateбудет равно string (0) "".
Никола Петкански