Обработка даты из формы в PHP

Раздел: Веб-разработка на PHP -> Обработка форм в PHP

Обработка даты из HTML формы в PHP

Получение даты из веб-формы и последующая работа с ней - типичная задача веб-разработки. HTML5 предоставляет элемент <input type="date">, который отправляет строку в формате YYYY-MM-DD. В PHP эту строку необходимо корректно принять, проверить и преобразовать в нужный формат для хранения или отображения. Далее рассмотрены основные подходы, их цели и возможные сложности.

Как получить и проверить дату из формы с помощью DateTime?

Самый надёжный способ - использовать класс DateTime в сочетании с фильтрацией входных данных. Это позволяет избежать ошибок, связанных с некорректными строками, и даёт гибкие возможности форматирования.

Цель: универсальное решение для любой даты, переданной через форму.


// Пример: форма содержит поле name="birthday"
$rawDate = filter_input(INPUT_POST, 'birthday', FILTER_UNSAFE_RAW);
if (!$rawDate) {
    // ошибка: поле отсутствует
}

$date = DateTime::createFromFormat('Y-m-d', $rawDate);
if (!$date) {
    // ошибка: неверный формат или невозможная дата (например, 2023-13-01)
}

// Далее можно форматировать
$formatted = $date->format('d.m.Y');
  

Input type submit php (кнопка submit в php-форме)

Вход: '2025-04-10' → $formatted = '10.04.2025'
Вход: '2025-02-29' → createFromFormat вернёт false (невисокосный год)
  

Input type name value php (обработка полей name и value в php-форме)

Типичная ошибка: передача даты в локальном формате (например, '10.04.2025') при отсутствии маски поля. При использовании DateTime::createFromFormat необходимо точно указать ожидаемый формат. Если формат различается, результат будет ложным.

Решение: договориться с фронтендом о едином формате (ISO 8601) или обрабатывать несколько вариантов через DateTime::createFromFormat с перебором.

Как просто получить дату без проверки?

Простейший вариант - использовать суперглобальный массив $_POST. Подходит для внутренних форм, где источник данных доверенный.


$dateString = $_POST['date'] ?? '';
echo 'Получена дата: ' . htmlspecialchars($dateString);
  

Php input type text (поле ввода text в php-форме)

Проблема: отсутствие валидации. Если пользователь отправит произвольную строку, скрипт может отработать некорректно (вызвать ошибку при попытке преобразовать). Не рекомендуется для публичных форм.

Как преобразовать дату с помощью strtotime и date?

Функции strtotime и date позволяют работать с датами в более свободном формате. strtotime пытается интерпретировать строку как английскую текстовую дату, что удобно для относительных выражений, но не для точных дат из формы.

Цель: быстрая конвертация, когда формат входной строки не строгий (например, '2025-04-10' или '10 April 2025').


$timestamp = strtotime($_POST['date']);
if ($timestamp === false) {
    // неверная дата
}
$formatted = date('d.m.Y', $timestamp);
  

Php request type (тип http-запроса (get/post) в php)

Ошибка: strtotime обрабатывает многие строки, но может дать неожиданный результат (например, '01.02.2025' будет интерпретировано как американский формат mm/dd/yy? Нет, strtotime не поддерживает точки, только дефисы или слэши). Кроме того, результат зависит от локали. Рекомендуется явно задавать ожидаемый формат через DateTime::createFromFormat.

Как учесть часовой пояс при обработке даты из формы?

Если дата связана с конкретным событием, важно установить нужную временную зону (например, 'Europe/Moscow').

Цель: корректное отображение времени для пользователей из разных регионов.


$date = new DateTime($_POST['date'], new DateTimeZone('UTC'));
$date->setTimezone(new DateTimeZone('Europe/Moscow'));
echo $date->format('d.m.Y H:i:s');
  

Php form input type (типы полей ввода в php-форме)

Проблема: временная зона по умолчанию в PHP может не совпадать с зоной пользователя. Следует либо использовать UTC для хранения, либо явно установить зону при создании объекта DateTime.

Как подготовить дату для записи в базу данных MySQL?

MySQL ожидает строку в формате 'YYYY-MM-DD'. После валидации можно передать исходную строку (если она уже в этом формате) или преобразовать через DateTime.

Цель: безопасное сохранение даты.


$date = DateTime::createFromFormat('Y-m-d', $_POST['date']);
if ($date) {
    $sql = 'INSERT INTO table (date_col) VALUES (:date)';
    $stmt = $pdo->prepare($sql);
    $stmt->execute([':date' => $date->format('Y-m-d')]);
}
  

Php form date (php дата из формы)

Ошибка: передача непроверенной строки напрямую в SQL-запрос (SQL-инъекция). Использование подготовленных запросов с PDO полностью решает эту проблему.

Как проверить, что дата находится в допустимом диапазоне?

Например, дата рождения не может быть в будущем, а дата окончания контракта должна быть позже даты начала.

Цель: бизнес-логика приложения.


$start = DateTime::createFromFormat('Y-m-d', $_POST['start_date']);
$end   = DateTime::createFromFormat('Y-m-d', $_POST['end_date']);

if ($end <= $start) {
    // ошибка: дата окончания должна быть позже даты начала
}
  

Проблема: сравнение строк не сработает, если формат отличается. Использование объектов DateTime гарантирует корректное сравнение.

Расширенные примеры работы с датой из формы

Ниже приведены более сложные и специализированные сценарии обработки дат, которые могут понадобиться в реальных проектах.

Пример 1: Обработка нескольких полей даты (диапазон)

Форма содержит две даты: начало и конец периода. Необходимо проверить, что обе даты корректны и первая не превышает вторую, после чего вывести их в человекочитаемом виде.

Пример

$startRaw = $_POST['date_start'] ?? '';
$endRaw   = $_POST['date_end'] ?? '';

$start = DateTime::createFromFormat('Y-m-d', $startRaw);
$end   = DateTime::createFromFormat('Y-m-d', $endRaw);

if (!$start || !$end) {
    $error = 'Одна из дат неверна.';
} elseif ($end <= $start) {
    $error = 'Дата окончания должна быть позже даты начала.';
} else {
    $period = $start->diff($end)->days;
    echo 'Период: ' . $start->format('d.m.Y') . ' - ' . $end->format('d.m.Y') . ' (' . $period . ' дней)';
}
Вход: start = "2025-01-01", end = "2025-01-10"
Выход: Период: 01.01.2025 - 10.01.2025 (9 дней)

Пример 2: Использование DateInterval для добавления дней

Пользователь выбирает дату и указывает количество дней (например, срок доставки). Нужно вычислить новую дату.

Пример

$baseDate = DateTime::createFromFormat('Y-m-d', $_POST['start_date']);
$offset   = (int) ($_POST['days'] ?? 0);

if (!$baseDate || $offset <= 0) {
    echo 'Некорректные данные.';
} else {
    $newDate = clone $baseDate;
    $newDate->add(new DateInterval('P' . $offset . 'D'));
    echo 'Исходная дата: ' . $baseDate->format('d.m.Y') . '\n';
    echo 'Через ' . $offset . ' дней: ' . $newDate->format('d.m.Y');
}
Вход: start_date = "2025-03-01", days = 10
Выход:
Исходная дата: 01.03.2025
Через 10 дней: 11.03.2025

Пример 3: Работа с датами из текстового поля (пользователь вводит дату вручную)

Если фронтенд не использует datepicker, пользователь может ввести дату в произвольном формате. Нужно попытаться разобрать разные варианты.

Пример

$input = trim($_POST['manual_date']);
$formats = ['d.m.Y', 'Y-m-d', 'd/m/Y', 'Y/m/d', 'j F Y']; // перебор форматов
$date = null;
foreach ($formats as $format) {
    $d = DateTime::createFromFormat($format, $input);
    if ($d && $d->format($format) === $input) {
        $date = $d;
        break;
    }
}
if (!$date) {
    echo 'Не удалось распознать дату.';
} else {
    echo 'Распознанная дата: ' . $date->format('d.m.Y');
}
Вход: "10.04.2025" → Распознанная дата: 10.04.2025
Вход: "2025/04/10" → Распознанная дата: 10.04.2025
Вход: "10 April 2025" → Распознанная дата: 10.04.2025
Вход: "32.13.2025" → Не удалось распознать дату.

Пример 4: Валидация даты с учётом рабочих дней (пропуск выходных)

Необходимо проверить, что выбранная дата является рабочим днём (пн-пт).

Пример

$date = DateTime::createFromFormat('Y-m-d', $_POST['delivery_date']);
if (!$date) {
    echo 'Неверная дата.';
} else {
    $dayOfWeek = (int) $date->format('N'); // 1 понедельник, 7 воскресенье
    if ($dayOfWeek >= 6) {
        echo 'Выбранная дата выпадает на выходной. Выберите будний день.';
    } else {
        echo 'Дата допустима.';
    }
}
Вход: "2025-04-12" (суббота) → Выбранная дата выпадает на выходной.
Вход: "2025-04-14" (понедельник) → Дата допустима.

Пример 5: Сохранение даты в БД с отметкой времени создания

При вставке записи с датой из формы также фиксируется текущее время (created_at).

Пример

$date = DateTime::createFromFormat('Y-m-d', $_POST['event_date']);
if (!$date) {
    die('Ошибка в дате.');
}
$now = new DateTime('now', new DateTimeZone('UTC'));

$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->prepare('INSERT INTO events (event_date, created_at) VALUES (:event_date, :created_at)');
$stmt->execute([
    ':event_date' => $date->format('Y-m-d'),
    ':created_at' => $now->format('Y-m-d H:i:s')
]);
echo 'Событие добавлено.';
Вход: event_date = "2025-05-01"
В БД: event_date = "2025-05-01", created_at = "2025-04-10 14:30:00" (зависит от текущего времени)

PHP дата из формы - comments

En
Php form date (php)