Сравнение даты - времени с интервалом на PHP
Варианты реализации от AI ChatGPT с применением DateTime и DateTimeImmutable + DateInterval.
- Сравнение с помощью DateTime + DateInterval
- Сравнение с примерением DateTimeImmutable + DateInterval
- Класс DateInterval описание аргументов
- Функция сравнения даты с интервалом и выводом результата в секундах.
При организации вывода интерактизных блоков на сайте возникла необходимость формировать доступ к их редактированию только в течении 20 минут после создания. По традиции сформировал и задал вопрос к AI ChatGPT:
Нужно на PHP сравнить дату-время в формате Y-m-d H:i:s c текущим временем плюс 20 минут и если исходное меньше текущего плюс 20 минут, то вывести true, а если меньше - false. Код с пояснениями.
$datetime = '2022-12-31 23:40:00'; // исходная дата-время в формате Y-m-d H:i:s $interval = new DateInterval('PT20M'); // создаем интервал в 20 минут $now = new DateTime(); // текущее время $now->add($interval); // добавляем интервал в 20 минут к текущему времени if (new DateTime($datetime) < $now) { // сравниваем исходную дату-время с текущим временем + 20 минут echo "true"; } else { echo "false"; }
В первой строке мы задаем исходную дату-время в формате Y-m-d H:i:s.
Во второй строке мы создаем интервал в 20 минут с помощью класса DateInterval
.
В третьей строке мы создаем объект DateTime
для текущего времени и добавляем к нему интервал в 20 минут с помощью метода add
.
Затем мы сравниваем исходную дату-время, преобразованную в объект DateTime
, с текущим временем + 20 минут. Если исходная дата-время меньше текущего времени + 20 минут, мы выводим "true", в противном случае выводим "false".
Ответ получился рабочий, но мне захотелось получить функцию с применением DateTimeImmutable. Для этого пришлось немного изменить вопрос:
Нужна функция на PHP которая сравнивает передаваемую в неё дату-время в формате Y-m-d H:i:s c текущим временем плюс 20 минут и если исходное меньше текущего плюс 20 минут, то вернуть true, а если меньше - false. Использовать DateTimeImmutable. Код с пояснениями.
function compareDateTime(string $dateString): bool { $date = DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $dateString); $nowPlus20 = (new DateTimeImmutable())->add(new DateInterval('PT20M')); return $date < $nowPlus20; }
Давайте разберемся, что здесь происходит:
- Мы создаем функцию
compareDateTime
, которая принимает один аргумент - строку с датой-временем в форматеY-m-d H:i:s
. - Создаем объект
DateTimeImmutable
из переданной строки даты. - Создаем объект
DateTimeImmutable
для текущего времени и добавляем к нему интервал в 20 минут с помощью методаadd()
. Полученный результат сохраняем в переменную$nowPlus20
. - Сравниваем дату из аргумента функции с
$nowPlus20
и возвращаемtrue
, если она меньше, иfalse
в противном случае.
Обратите внимание на использование класса DateInterval
, который позволяет добавлять к дате или времени определенный интервал. В данном случае мы добавляем интервал в 20 минут (PT20M
).
Ответ в виде функции с применением DateTimeImmutable
тоже отлично работает, но ещё и более компактен.
Класс DateInterval
Класс DateInterval принимает следующие аргументы:
- P
<
n>Y - количество лет (n может быть десятичным числом) - P
<
n>M - количество месяцев (n может быть десятичным числом) - P
<
n>D - количество дней (n может быть десятичным числом) - PT
<
n>H - количество часов (n может быть десятичным числом) - PT
<
n>M - количество минут (n может быть десятичным числом) - PT
<
n>S - количество секунд (n может быть десятичным числом)
Для создания объекта DateInterval, передайте строку, содержащую нужные значения, в конструктор класса DateInterval. Например:
$interval = new DateInterval('P1Y2M3DT4H5M6S'); //В этом случае, $interval будет содержать интервал времени в 1 год, 2 месяца, 3 дня, 4 часа, 5 минут и 6 секунд.
Класс DateInterval также принимает несколько других аргументов, таких как:
- $days - количество дней (может быть отрицательным)
- $hours - количество часов (может быть отрицательным)
- $minutes - количество минут (может быть отрицательным)
- $seconds - количество секунд (может быть отрицательным)
- $microseconds - количество микросекунд (может быть отрицательным)
Пример создания объекта DateInterval с помощью этих аргументов:
$interval = new DateInterval('P1Y2M3DT4H5M6S'); $interval->d = 7; $interval->h = 12; $interval->i = 30; $interval->s = 45; $interval->f = 0.5;
В этом случае, $interval
будет содержать интервал времени в 1 год, 2 месяца, 3 дня, 12 часов, 30 минут, 45 секунд и 500 миллисекунд.
Функция сравнения даты с интервалом и выводом результата в секундах.
Немного изменим задачу. Допустим нам нужно чтобы функция отдавала разницу в секундах от текущего значения времени до времени которое подаётся в функцию + заданный интервал. В случае если разница имеет отрицательное значение функция вернёт falshe.
Вот вопрос к AI: Нужна php функция. На вход подаётся: Первый параметр строка дата-время из базы данных в формате `Y-m-d H:i:s`, второй параметр - интервал в минутах $interval. Функция прибавляет к первому параметру интервал $interval, а затем полученный результат сравнивает с текущим временем сервера, если текущее время меньше результата суммы входных параметров, то вычисляет разницу в секундах и возвращает на выход функции, а если нет, то возвращает falshe.
Ответ 3 от AI ChatGPT:
Вот пример PHP функции, которая должна делать то, что вы описали:
function compareDateTime($dateTimeStr, $interval) { // Преобразуем строку даты-времени в объект DateTime $dateTime = DateTime::createFromFormat('Y-m-d H:i:s', $dateTimeStr); // Добавляем интервал в минутах к дате-времени $dateTime->add(new DateInterval('PT'.$interval.'M')); // Получаем текущую дату-время сервера $now = new DateTime(); // Сравниваем дату-время из базы с текущей датой-временем сервера if ($dateTime > $now) { // Вычисляем разницу в секундах между двумя датами $diff = $dateTime->getTimestamp() - $now->getTimestamp(); return $diff; } else { return false; } } //Пример использования: $dateTimeStr = '2021-08-30 12:00:00'; $interval = 30; $result = compareDateTime($dateTimeStr, $interval); if ($result !== false) { echo 'Разница в секундах: '.$result; } else { echo 'Текущее время больше, чем дата-время + интервал';
Обратите внимание, что в этом примере мы не используем тройные обратные кавычки и markdown, так как результат функции предполагается выводить не в виде таблицы или кода, а просто в виде строки.
Функция отлично справляется со своей задачей например, в комментировании постов на сайте. После создания пользователем сообщения и его публикации часто случается, что содержание содержит ошибку или описку. Конечно нужно дать возможность исправления текста но оганичить по времени, допустим 15 минут. Зачем ограничивать? Да по многим причинам - например, не дать изменять текст после модерации или когда уже ответили на это сообщение, или через длительное время кто-то захочет некрасиво поумничить, а ветка уже затерялась во времени. Самое то, это дать на редактирование 10-20 минут, а после модерации вообще запретить к редактированию.
Дата публикации: