Как преобразовать дату из формата MySQL DATETIME в другой формат с помощью 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
?>
Подробное объяснение по шагам
- strtotime() — принимает строку с датой в текстовом формате и возвращает Unix-метку времени. Она понимает множество форматов, включая стандартный MySQL DATETIME.
- 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.2023j F Y, H:i— 15 October 2023, 14:30 (английские названия месяцев)d.m.Y H:i:s— 15.10.2023 14:30:00Y-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, вы получите правильные русские названия без ручного создания массива месяцев.
Ответов пока нет.
Войдите чтобы оставить ответ