Форматирование дат: практические PHP-инструменты
Основы форматирования даты и времени в PHP
Как отформатировать дату и время с помощью DateTime::format()?
Современный и гибкий способ форматирования даты и времени в PHP основан на классах DateTime и DateTimeImmutable. Метод format() принимает строку формата, аналогичную функции date(), и возвращает отформатированную строку.
$date = new DateTime('2025-03-23 14:30:00');
echo $date->format('d.m.Y H:i:s');
Php new datetime (создание объекта datetime в php)
23.03.2025 14:30:00
Php datetime format (форматирование даты и времени в php)
Метод автоматически учитывает часовой пояс, установленный в объекте. Для смены пояса используется метод setTimezone().
$date = new DateTime('now', new DateTimeZone('Europe/Moscow'));
echo $date->format('Y-m-d H:i:s T');
Php дата создания (работа с датой в php)
2025-03-23 14:30:00 MSK
Типичная ошибка: использование неверных символов формата (например, M вместо m). Это приводит к неожиданным результатам. Всегда сверяйтесь с документацией.
Проблема с часовыми поясами: если не указать часовой пояс в конструкторе или не установить его через setTimezone(), используется пояс сервера, что может отличаться от ожидаемого. Решение - всегда явно задавать нужный часовой пояс.
Как использовать функцию date() для форматирования?
Классическая процедурная функция date(format, timestamp) остаётся популярной для простых задач. Второй аргумент - целочисленная метка времени Unix, по умолчанию текущая.
echo date('l, F j, Y');
Sunday, March 23, 2025
Для работы с произвольной датой требуется преобразование строки в метку времени функцией strtotime().
$timestamp = strtotime('2025-12-31 23:59:59');
echo date('d.m.Y H:i:s', $timestamp);
31.12.2025 23:59:59
Ошибка при передаче некорректной строки в strtotime(): функция возвращает false, что приводит к выводу 01.01.1970. Рекомендуется проверять результат через if ($timestamp === false).
Проблема локализации: функция date() всегда выводит названия месяцев и дней недели на английском языке. Для локализации требуется дополнительная обработка.
Как отформатировать дату с учётом локали через IntlDateFormatter?
Класс IntlDateFormatter из расширения intl позволяет получать даты на разных языках и в региональных форматах. Требуется установка расширения intl.
$formatter = new IntlDateFormatter('ru_RU', IntlDateFormatter::LONG, IntlDateFormatter::SHORT);
echo $formatter->format(new DateTime());
23 марта 2025 г., 14:30
Можно задать произвольный шаблон через метод setPattern() или третий аргумент конструктора (формат для времени).
Ошибка: класс не найден - расширение intl не установлено. Проверьте наличие через phpinfo() или установите пакет php-intl.
Проблема с кодировкой: некоторые шаблоны (например, EEEE для полного названия дня недели) могут не работать в старых версиях ICU. Следует обновлять ICU и PHP.
Когда уместна устаревшая функция strftime()?
Функция strftime() была удалена в PHP 8.1. Ранее она позволяла локализованный вывод с использованием спецификаторов в стиле C. Для старых проектов можно использовать её, но для нового кода рекомендуется переходить на IntlDateFormatter.
// Работает в PHP < 8.1
setlocale(LC_TIME, 'ru_RU.UTF-8');
echo strftime('%A, %d %B %Y');
воскресенье, 23 марта 2025
Ошибка в PHP 8.1 и выше: вызов strftime() вызывает фатальную ошибку. Альтернатива - IntlDateFormatter или вручную перевести месяц/день с помощью массивов.
Расширенные примеры форматирования даты и времени
// Пример 1: Форматирование с разными часовыми поясами
$date = new DateTime('2025-06-15 10:00:00', new DateTimeZone('UTC'));
echo 'UTC: ' . $date->format('Y-m-d H:i:s') . "\n";
$date->setTimezone(new DateTimeZone('America/New_York'));
echo 'NY: ' . $date->format('Y-m-d H:i:s T');
UTC: 2025-06-15 10:00:00 NY: 2025-06-15 06:00:00 EDT
// Пример 2: Использование DateTimeImmutable для неизменяемых объектов
$date = new DateTimeImmutable('2025-01-01');
$formatted = $date->format('d.m.Y');
echo $formatted . "\n";
// Любая попытка изменить объект вернёт новый экземпляр
$modified = $date->modify('+1 day');
echo $modified->format('d.m.Y');
01.01.2025 02.01.2025
// Пример 3: Кастомный формат с IntlDateFormatter
$formatter = new IntlDateFormatter('de_DE', IntlDateFormatter::NONE, IntlDateFormatter::NONE);
$formatter->setPattern('EEEE, dd. MMMM yyyy');
echo $formatter->format(new DateTime('2025-12-25'));
Donnerstag, 25. Dezember 2025
// Пример 4: Работа с метками времени и date()
$timestamp = time();
echo 'Текущая метка: ' . $timestamp . "\n";
echo 'Дата: ' . date('Y-m-d H:i:s', $timestamp) . "\n";
// Форматирование с относительным временем
$future = strtotime('+2 weeks 3 days');
echo 'Через 2 недели и 3 дня: ' . date('d.m.Y', $future);
Текущая метка: 1711193400 Дата: 2025-03-23 14:30:00 Через 2 недели и 3 дня: 09.04.2025
// Пример 5: Обработка ошибок при strtotime
$dateStr = '2025-13-01'; // неверный месяц
$timestamp = strtotime($dateStr);
if ($timestamp === false) {
echo 'Не удалось разобрать дату: ' . $dateStr;
} else {
echo date('Y-m-d', $timestamp);
}
Не удалось разобрать дату: 2025-13-01
// Пример 6: Форматирование с микросекундами (PHP 7.1+)
$micro = microtime(true);
$seconds = floor($micro);
$milliseconds = round(($micro - $seconds) * 1000);
echo date('Y-m-d H:i:s', $seconds) . '.' . sprintf('%03d', $milliseconds);
2025-03-23 14:30:00.456
// Пример 7: Локализация через IntlDateFormatter с указанием календаря
$formatter = new IntlDateFormatter(
'ar_SA',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'Asia/Riyadh',
IntlDateFormatter::ISLAMIC
);
echo $formatter->format(new DateTime('2025-03-23'));
الأحد، 22 رمضان 1446 هـ 02:30:00 PM UTC+03:00
// Пример 8: Использование DateInterval для относительного форматирования
$date = new DateTime('2025-02-28');
$interval = new DateInterval('P1M'); // один месяц
$date->add($interval);
echo $date->format('Y-m-d'); // учёт февраля (високосный/невисокосный)
2025-03-28