Сравнение даты - времени с интервалом на PHP

Варианты реализации от AI ChatGPT с применением DateTime и DateTimeImmutable + DateInterval.


  1. Сравнение с помощью DateTime + DateInterval
  2. Сравнение с примерением DateTimeImmutable + DateInterval
  3. Класс DateInterval описание аргументов
  4. Функция сравнения даты с интервалом и выводом результата в секундах.

При организации вывода интерактизных блоков на сайте возникла необходимость формировать доступ к их редактированию только в течении 20 минут после создания. По традиции сформировал и задал вопрос к AI ChatGPT:

Нужно на PHP сравнить дату-время в формате Y-m-d H:i:s c текущим временем плюс 20 минут и если исходное меньше текущего плюс 20 минут, то вывести true, а если меньше - false. Код с пояснениями.

 Ответ от AI ChatGPT:
Вот код на PHP, который решает задачу:
PHP
$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. Код с пояснениями.

 Ответ 2 от AI ChatGPT:
Конечный код будет выглядеть так:
PHP
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;
}

Давайте разберемся, что здесь происходит:

  1. Мы создаем функцию compareDateTime, которая принимает один аргумент - строку с датой-временем в формате Y-m-d H:i:s.
  2. Создаем объект DateTimeImmutable из переданной строки даты.
  3. Создаем объект DateTimeImmutable для текущего времени и добавляем к нему интервал в 20 минут с помощью метода add(). Полученный результат сохраняем в переменную $nowPlus20.
  4. Сравниваем дату из аргумента функции с $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. Например:

PHP
$interval = new DateInterval('P1Y2M3DT4H5M6S');

//В этом случае, $interval будет содержать интервал времени в 1 год, 2 месяца, 3 дня, 4 часа, 5 минут и 6 секунд.

Класс DateInterval также принимает несколько других аргументов, таких как:

  • $days - количество дней (может быть отрицательным)
  • $hours - количество часов (может быть отрицательным)
  • $minutes - количество минут (может быть отрицательным)
  • $seconds - количество секунд (может быть отрицательным)
  • $microseconds - количество микросекунд (может быть отрицательным)

Пример создания объекта DateInterval с помощью этих аргументов:

PHP
$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 функции, которая должна делать то, что вы описали:

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

Дата публикации: 

ТОП 10 случайных публикаций



Сайт разработан студией © WEB-VidST   


Яндекс.Метрика