Avatar ·

Как преобразовать дату из формата MySQL DATETIME в другой формат с помощью PHP?

Всем привет! Я новичок в PHP и пишу свой первый сайт на этом языке с базой данных MySQL. У меня есть таблица `users`, в которой хранится дата регистрации пользователя в стандартном для MySQL формате DATETIME: `2023-10-15 14:30:00`. Когда я вывожу эту дату на страницу через `echo $row['registration_date'];`, она отображается в том же некрасивом формате, например "2023-10-15 14:30:00". А мне нужно, чтобы дата показывалась как "15 октября 2023, 14:30" или хотя бы "15.10.2023". Я пробовал использовать функцию `date()`, но она возвращает текущую дату, а не ту, что из базы. Пытался передать строку из БД в `strtotime()`, но не уверен, что делаю это правильно. Вот мой текущий код: ```php ``` Подскажите, пожалуйста, как правильно преобразовать эту дату в нужный мне формат? И что делать, если дата приходит из базы как строка, а не как объект времени? Заранее спасибо за помощь! <<>>

Решение: используйте комбинацию strtotime() и date()

Ваша проблема типична для начинающих разработчиков. MySQL возвращает дату в формате DATETIME как обычную строку (например, "2023-10-15 14:30:00"). Чтобы преобразовать её в любой другой формат, нужно сначала превратить эту строку в Unix-метку времени (количество секунд с 1 января 1970 года), а затем отформатировать её с помощью функции date().

Вот правильный подход:

<?php
$mysql_date = "2023-10-15 14:30:00";
$timestamp = strtotime($mysql_date); // превращаем строку в Unix-метку
$formatted_date = date("d.m.Y H:i", $timestamp); // форматируем как 15.10.2023 14:30
echo $formatted_date; // выведет: 15.10.2023 14:30
?>

Подробное объяснение по шагам

  1. strtotime() — принимает строку с датой в текстовом формате и возвращает Unix-метку времени. Она понимает множество форматов, включая стандартный MySQL DATETIME.
  2. date() — принимает два параметра: формат вывода и Unix-метку времени. Если метка не указана, используется текущее время.

Полный пример с вашим кодом

<?php
$query = "SELECT username, registration_date FROM users WHERE id = 1";
$result = mysqli_query($conn, $query);
$row = mysqli_fetch_assoc($result);

$timestamp = strtotime($row['registration_date']);
$formatted_date = date("d.m.Y H:i", $timestamp);
echo "Дата регистрации: " . $formatted_date;
// выведет: Дата регистрации: 15.10.2023 14:30
?>

Варианты форматирования (символы для date())

  • d.m.Y — 15.10.2023
  • j F Y, H:i — 15 October 2023, 14:30 (английские названия месяцев)
  • d.m.Y H:i:s — 15.10.2023 14:30:00
  • Y-m-d — 2023-10-15 (только дата)
  • l, j F Y — Sunday, 15 October 2023 (день недели + дата)

Русские названия месяцев

Если вам нужны русские названия (например, "15 октября 2023"), используйте функцию strftime() (устаревшая в PHP 8.1+) или массив с месяцами:

<?php
$months = [
    1 => 'января', 2 => 'февраля', 3 => 'марта',
    4 => 'апреля', 5 => 'мая', 6 => 'июня',
    7 => 'июля', 8 => 'августа', 9 => 'сентября',
    10 => 'октября', 11 => 'ноября', 12 => 'декабря'
];

$timestamp = strtotime("2023-10-15 14:30:00");
$day = date("j", $timestamp);
$month = (int)date("n", $timestamp);
$year = date("Y", $timestamp);
$time = date("H:i", $timestamp);

echo "$day {$months[$month]} $year, $time";
// выведет: 15 октября 2023, 14:30
?>

Важные замечания

  • Убедитесь, что временная зона в PHP установлена правильно. Добавьте в начале скрипта: date_default_timezone_set('Europe/Moscow');
  • Если strtotime() возвращает false (неверный формат даты), проверьте, что строка из БД не пустая и не содержит NULL.
  • Для работы с более сложными манипуляциями (разница между датами, добавление дней) используйте класс DateTime (смотрите альтернативный ответ).
<<>>

Альтернатива: используйте класс DateTime (рекомендуется для PHP 5.2+)

Класс DateTime предоставляет объектно-ориентированный способ работы с датами. Он более гибкий и удобный для сложных операций. Вот как решить вашу задачу с его помощью:

<?php
$mysql_date = "2023-10-15 14:30:00";
$date = new DateTime($mysql_date); // создаём объект из строки
echo $date->format("d.m.Y H:i");   // выведет: 15.10.2023 14:30
?>

Преимущества DateTime

  • Чистота кода: не нужно вызывать strtotime() отдельно.
  • Изменение временной зоны: можно легко перевести дату в другой часовой пояс.
  • Сравнение дат: объекты DateTime можно сравнивать операторами < > ==.

Пример с русскими месяцами и временной зоной

<?php
$date = new DateTime("2023-10-15 14:30:00", new DateTimeZone('UTC'));
$date->setTimezone(new DateTimeZone('Europe/Moscow')); // меняем зону

// Для русских названий используем IntlDateFormatter (требуется расширение intl)
$formatter = new IntlDateFormatter('ru_RU', IntlDateFormatter::LONG, IntlDateFormatter::SHORT);
echo $formatter->format($date); // выведет: 15 октября 2023 г., 14:30
?>

Этот подход более современный и рекомендуется для новых проектов. Если у вас установлено расширение intl, вы получите правильные русские названия без ручного создания массива месяцев.