Форматирование дат для русскоязычных пользователей с помощью PHP
При работе с датами в PHP часто возникает необходимость вывести их на русском языке: названия месяцев, дней недели. Стандартная функция date() выводит названия на английском. Рассмотрим способы локализации дат.
Основные подходы к локализации дат в PHP
Рекомендуемый способ - использовать класс IntlDateFormatter из расширения intl. Он поддерживает локали и гибкое форматирование.
$fmt = new IntlDateFormatter('ru_RU', IntlDateFormatter::LONG, IntlDateFormatter::NONE);
$date = new DateTime('2024-12-25');
echo $fmt->format($date); // 25 декабря 2024 г.
Php date ru (php дата на русском)
25 декабря 2024 г.
дата php mysql (дата в php и mysql)
Для точного вывода в именительном падеже: используйте паттерн.
$fmt = new IntlDateFormatter('ru_RU', IntlDateFormatter::NONE, IntlDateFormatter::NONE, null, null, 'd MMMM yyyy');
echo $fmt->format($date); // 25 декабря 2024
Php 7 дата (даты в php 7)
25 декабря 2024
Php текущая дата (получение текущей даты в php)
Как вывести дату на русском без установки дополнительных расширений?
Можно использовать функцию strftime с установкой локали через setlocale.
setlocale(LC_TIME, 'ru_RU.UTF-8');
echo strftime('%e %B %Y', strtotime('2024-12-25')); // 25 декабря 2024
Php дата в timestamp (преобразование даты в timestamp в php)
25 декабря 2024
Php дата в строку (преобразование даты в строку в php)
Проблемы: Функции strftime и setlocale объявлены устаревшими в PHP 8.1+. На Windows необходимо устанавливать расширение и правильные имена локалей (Russian_Russia.1251). strftime может неправильно обрабатывать многобайтовые кодировки.
Как сделать перевод даты вручную с помощью массивов?
Можно создать массивы с названиями месяцев и дней недели.
$months = [1 => 'января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'];
$dayOfWeek = ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'];
$date = '2024-12-25';
$ts = strtotime($date);
echo date('j', $ts) . ' ' . $months[date('n', $ts)] . ' ' . date('Y', $ts) . ', ' . $dayOfWeek[date('w', $ts)];
прибавить к дате php (прибавление дней к дате в php)
25 декабря 2024, среда
Php дата между (проверка даты между двумя датами в php)
Следует учесть падеж (родительный для чисел). В массиве выше использован родительный падеж. Для других конструкций (например, "Декабрь 2024") нужен именительный. Ошибка - перепутать падеж или забыть про индексацию массива с 1 для месяцев.
Какие возможности даёт библиотека Carbon?
Carbon - популярная библиотека для работы с датами. Она имеет встроенную локализацию.
// Установка: composer require nesbot/carbon
use Carbon\Carbon;
Carbon::setLocale('ru');
echo Carbon::parse('2024-12-25')->isoFormat('D MMMM YYYY'); // 25 декабря 2024
Php разница дат (разница между датами в php)
25 декабря 2024
Требует установки через Composer и расширение intl для работы некоторых локалей. В Laravel Carbon доступен по умолчанию.
Рассмотрим более сложные сценарии локализации дат на русском.
// Вывод дня недели и месяца в FULL формате
$fmt = new IntlDateFormatter('ru_RU', IntlDateFormatter::FULL, IntlDateFormatter::NONE);
echo $fmt->format(new DateTime('2024-12-25')); // среда, 25 декабря 2024 г.
среда, 25 декабря 2024 г.
// Форматирование с временем
$fmt = new IntlDateFormatter('ru_RU', IntlDateFormatter::LONG, IntlDateFormatter::SHORT);
echo $fmt->format(new DateTime('2024-12-25 14:30:00')); // 25 декабря 2024 г., 14:30
25 декабря 2024 г., 14:30
// Склонение месяцев в родительном падеже для записи "1 января"
$fmt = new IntlDateFormatter('ru_RU', IntlDateFormatter::NONE, IntlDateFormatter::NONE, null, null, 'd MMMM yyyy');
echo $fmt->format(new DateTime('2024-12-25')); // 25 декабря 2024
25 декабря 2024
// Вывод относительных дат "вчера", "сегодня" на русском с Carbon
use Carbon\Carbon;
Carbon::setLocale('ru');
echo Carbon::now()->subDay()->diffForHumans(); // 1 день назад
echo "\n";
echo Carbon::now()->diffForHumans(); // только что
1 день назад только что
// Использование setlocale с новым кодом на Windows (если доступно)
setlocale(LC_TIME, 'rus');
echo strftime('%B', strtotime('2024-12-25')); // Декабрь (может работать)
Декабрь
// Ручной массив с учетом склонения для предлогов
$months = ['января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря'];
$date = new DateTime('2024-12-25');
echo $date->format('j') . ' ' . $months[(int)$date->format('n')-1] . ' ' . $date->format('Y');
25 декабря 2024
При использовании IntlDateFormatter возможно форматирование по шаблону CLDR.
$fmt = new IntlDateFormatter('ru_RU', IntlDateFormatter::NONE, IntlDateFormatter::NONE, 'Europe/Moscow', null, 'EEEE, d MMMM y \'года\'');
echo $fmt->format(new DateTime('2024-12-25')); // среда, 25 декабря 2024 года
среда, 25 декабря 2024 года