Форматирование дат: практические PHP-инструменты

Раздел: Основы PHP -> Работа с датой и временем в 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

форматирование даты и времени в PHP - comments

En
Php datetime format (php)