Сравнение даты - времени с интервалом на 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 минут, а после модерации вообще запретить к редактированию.
Дата публикации:

