Как конвертировать формат даты в PHP: из YYYY-MM-DD в DD.MM.YYYY и другие варианты
Решение с использованием DateTime::createFromFormat (рекомендуемый способ)
Проблема, которую вы описали, очень распространена среди PHP-разработчиков. Использование strtotime() действительно работает, но имеет ограничения: оно корректно обрабатывает только стандартные форматы дат (например, YYYY-MM-DD или MM/DD/YYYY). Если формат входной даты отличается, strtotime() может вернуть false или неверный timestamp. Лучший способ — использовать класс DateTime с методом createFromFormat().
Вот как правильно конвертировать дату из формата YYYY-MM-DD в DD.MM.YYYY:
<?php
$dateString = "2025-04-12";
// Создаём объект DateTime из строки с указанием её формата
$date = DateTime::createFromFormat('Y-m-d', $dateString);
// Проверяем, удалось ли создать объект
if ($date === false) {
echo "Ошибка: неверный формат даты";
} else {
// Форматируем дату в нужный вид
$newDate = $date->format('d.m.Y');
echo $newDate; // Выведет: 12.04.2025
}
?>
Обратное преобразование: из DD.MM.YYYY в YYYY-MM-DD
Для конвертации даты из формата "день.месяц.год" обратно в формат MySQL (YYYY-MM-DD) делаем аналогично:
<?php
$dateString = "12.04.2025";
$date = DateTime::createFromFormat('d.m.Y', $dateString);
if ($date === false) {
echo "Ошибка: неверный формат даты";
} else {
$newDate = $date->format('Y-m-d');
echo $newDate; // Выведет: 2025-04-12
}
?>
Работа с другими форматами
Метод createFromFormat() позволяет обрабатывать практически любые форматы. Вот несколько примеров:
- Из "12/04/2025" (месяц/день/год) в "2025-04-12":
DateTime::createFromFormat('m/d/Y', $date) - Из "12-Apr-2025" в "12.04.2025":
DateTime::createFromFormat('d-M-Y', $date) - Из "2025-04-12 15:30:00" в "12.04.2025 15:30":
DateTime::createFromFormat('Y-m-d H:i:s', $date)
Обработка ошибок и валидация
Важно помнить, что createFromFormat() возвращает false при ошибке. Всегда проверяйте результат. Кроме того, можно комбинировать с исключениями:
<?php
function convertDate(string $dateString, string $fromFormat, string $toFormat): string {
$date = DateTime::createFromFormat($fromFormat, $dateString);
if ($date === false) {
throw new InvalidArgumentException(
"Дата '$dateString' не соответствует формату '$fromFormat'"
);
}
return $date->format($toFormat);
}
// Использование
try {
echo convertDate("2025-04-12", "Y-m-d", "d.m.Y"); // 12.04.2025
echo convertDate("12-04-2025", "d-m-Y", "Y-m-d"); // 2025-04-12
} catch (InvalidArgumentException $e) {
echo "Ошибка: " . $e->getMessage();
}
?>
Почему это лучше, чем strtotime()?
strtotime() пытается "угадать" формат даты, что может привести к неожиданным результатам. Например, strtotime("12-04-2025") интерпретируется по-разному в зависимости от региональных настроек сервера (может быть 12 апреля или 4 декабря). createFromFormat() же чётко указывает, что означает каждый элемент строки, что делает код предсказуемым и безопасным.
Работа с часовыми поясами (для продвинутых)
Если ваше приложение работает с пользователями из разных часовых поясов, можно указать временную зону:
<?php
$date = DateTime::createFromFormat(
'Y-m-d H:i:s',
'2025-04-12 15:30:00',
new DateTimeZone('Europe/Moscow')
);
echo $date->format('d.m.Y H:i'); // 12.04.2025 15:30
?>
Используйте DateTime и createFromFormat() — это стандартный и самый надёжный способ работы с датами в современном PHP.
Альтернативный подход: использование функции date_create_from_format
В PHP есть процедурный аналог метода DateTime::createFromFormat() — функция date_create_from_format(). Она работает точно так же, но возвращает объект DateTime, а не использует синтаксис класса. Это может быть удобнее для тех, кто привык к процедурному стилю.
<?php
$dateString = "2025-04-12";
$date = date_create_from_format('Y-m-d', $dateString);
if ($date === false) {
echo "Ошибка парсинга даты";
} else {
echo date_format($date, 'd.m.Y'); // 12.04.2025
}
?>
Дополнительный совет: работа с массивом дат
Если нужно конвертировать много дат, можно написать вспомогательную функцию, которая принимает массив:
<?php
function convertDates(array $dates, string $fromFormat, string $toFormat): array {
return array_map(function($date) use ($fromFormat, $toFormat) {
$d = DateTime::createFromFormat($fromFormat, $date);
return $d ? $d->format($toFormat) : null;
}, $dates);
}
$inputDates = ["2025-04-12", "2025-05-20", "invalid-date"];
$result = convertDates($inputDates, 'Y-m-d', 'd.m.Y');
print_r($result);
// Array ( [0] => 12.04.2025 [1] => 20.05.2025 [2] => )
?>
Также рекомендую всегда хранить даты в базе данных в формате YYYY-MM-DD (или DATETIME), а преобразовывать только при выводе пользователю. Это избавит от множества проблем с сортировкой и сравнением дат.
Ответов пока нет.
Войдите чтобы оставить ответ