Работа с датами в PHP: способы преобразования и форматирования

Раздел: Работа с данными в PHP -> Преобразование данных в PHP

Преобразование дат в PHP

Как наиболее эффективно преобразовывать даты в PHP, используя объектный подход?

Основным и рекомендуемым способом является использование встроенного класса DateTime. Он предоставляет гибкое управление датами, временем и временными зонами. Пример базового преобразования строки в другой формат:


$dateString = '2025-04-12 14:30:00';
$dateTime = new DateTime($dateString, new DateTimeZone('Europe/Moscow'));
echo $dateTime->format('d.m.Y H:i'); // 12.04.2025 14:30
  

Php преобразовать даты (преобразование дат в php)

12.04.2025 14:30

преобразовать массив php (преобразование массива в php)

Использование класса DateTime позволяет легко менять временные зоны, выполнять арифметические операции (add, sub, modify) и форматировать дату в любом нужном представлении. Этот подход подходит для большинства задач, где требуется точность и читаемость кода.

Типичные ошибки: передача строки, не распознаваемой парсером (например, '12.04.2025' без указания формата). В таком случае выбрасывается исключение. Решение: использовать DateTime::createFromFormat() для явного указания формата.


$dateString = '12.04.2025 14:30';
$dateTime = DateTime::createFromFormat('d.m.Y H:i', $dateString);
echo $dateTime->format('Y-m-d'); // 2025-04-12
    

Php преобразовать в строку (преобразование в строку в php)

2025-04-12

Как преобразовать дату, используя функции strtotime и date?

Процедурный подход с strtotime() и date() удобен для быстрых преобразований, когда не требуется работа с временными зонами.


$timestamp = strtotime('2025-04-12 14:30:00');
echo date('d.m.Y H:i', $timestamp); // 12.04.2025 14:30
  
12.04.2025 14:30

Цель: быстрое форматирование строки в другой вид без создания объектов. Подходит для простых сценариев.

Проблема: strtotime() не поддерживает все форматы (например, 'd/m/Y'). Возвращает false при ошибке, что может привести к неожиданным результатам. Решение - проверять возвращаемое значение.


$timestamp = strtotime('12/04/2025');
if ($timestamp === false) {
   echo 'Ошибка парсинга';
} else {
   echo date('Y-m-d', $timestamp);
}
    

Как собрать дату из отдельных компонентов (год, месяц, день) с помощью mktime?

Функция mktime() создаёт метку времени Unix из числовых значений. Полезна при работе с формами или базами данных.


$timestamp = mktime(14, 30, 0, 4, 12, 2025); // часы, минуты, секунды, месяц, день, год
echo date('r', $timestamp); // Sat, 12 Apr 2025 14:30:00 +0300
  
Sat, 12 Apr 2025 14:30:00 +0300

Случаи использования: когда данные приходят частями (например, из полей формы) или нужно сгенерировать дату по условию.

Ошибка: передача месяца или дня вне допустимого диапазона (13 месяц, 32 день) приводит к автоматической коррекции (например, 13 месяц станет январем следующего года). Это может быть неожиданным. Следует валидировать входные данные.


$timestamp = mktime(0,0,0,13,1,2025); // месяц 13 -> январь 2026
echo date('Y-m-d', $timestamp); // 2026-01-01
    
2026-01-01

Как преобразовать дату, используя date_create (процедурный стиль класса DateTime)?

Функция date_create() - процедурный аналог конструктора DateTime. Возвращает объект DateTime.


$dateTime = date_create('2025-04-12', new DateTimeZone('Asia/Novosibirsk'));
echo date_format($dateTime, 'd.m.Y H:i'); // 12.04.2025 14:30
  
12.04.2025 14:30

Подходит для тех, кто предпочитает процедурный стиль, но хочет использовать объектные возможности.

Ошибка: забывание указать часовой пояс может привести к использованию временной зоны по умолчанию (задаётся в php.ini). Рекомендуется явно задавать зону через date_default_timezone_set() или вторым параметром.

Как упростить работу с датами используя библиотеку Carbon?

Carbon - популярное расширение для DateTime с удобным синтаксисом и множеством дополнительных методов (человекочитаемые разницы, макросы).


use Carbon\Carbon;

$date = Carbon::parse('2025-04-12 14:30:00', 'Europe/Moscow');
echo $date->format('d.m.Y H:i'); // 12.04.2025 14:30
echo $date->diffForHumans(); // 2 hours ago (если сейчас 2025-04-12 16:30)
  

Цель: повышение читаемости кода и сокращение его объёма при частых манипуляциях с датами.

Проблема: необходимость установки библиотеки через Composer, что не всегда оправдано в небольших проектах. Кроме того, Carbon накладывает некоторые накладные расходы на производительность.

Расширенные примеры преобразования дат

Дополнительные сценарии работы с датами в PHP, включающие нестандартные форматы, интервалы и локализацию.

Преобразование даты из формата ISO 8601 в локализованный вид

Пример

$isoDate = '2025-04-12T14:30:00+03:00';
$dateTime = new DateTime($isoDate);
$dateTime->setTimezone(new DateTimeZone('America/New_York'));
echo $dateTime->format('l, F j, Y g:i A T'); // Saturday, April 12, 2025 7:30 AM EDT
Saturday, April 12, 2025 7:30 AM EDT

Работа с интервалами: вычисление возраста пользователя

Пример

$birthday = new DateTime('1990-05-20');
$today = new DateTime('2025-04-12');
$interval = $birthday->diff($today);
echo $interval->y . ' лет, ' . $interval->m . ' месяцев, ' . $interval->d . ' дней';
// 34 лет, 10 месяцев, 23 дней
34 лет, 10 месяцев, 23 дней

Сравнение дат с учётом временных зон

Пример

$date1 = new DateTime('2025-04-12 10:00:00', new DateTimeZone('UTC'));
$date2 = new DateTime('2025-04-12 13:00:00', new DateTimeZone('Europe/Moscow'));
// 13:00 MSK = 10:00 UTC, значит даты равны по UTC
echo $date1 == $date2 ? 'Даты равны' : 'Не равны'; // Даты равны
Даты равны

Преобразование timestamp в разные форматы с учётом локали (intl-расширение)

Пример

$timestamp = 1744452000; // предположительно 2025-04-12 10:00 UTC
$formatter = new IntlDateFormatter('ru_RU', IntlDateFormatter::LONG, IntlDateFormatter::SHORT);
$formatter->setTimeZone('Europe/Moscow');
echo $formatter->format($timestamp); // 12 апреля 2025 г., 13:00
12 апреля 2025 г., 13:00

Использование createFromFormat для нестандартных строк

Пример

$str = '12/04/2025 14:30:00'; // день/месяц/год
$dateTime = DateTime::createFromFormat('d/m/Y H:i:s', $str);
if ($dateTime) {
   echo $dateTime->format('Y-m-d H:i');
} else {
   echo 'Ошибка парсинга';
}
2025-04-12 14:30

Изменение даты с помощью modify и относительных форматов

Пример

$date = new DateTime('2025-04-12');
$date->modify('next monday');
echo $date->format('Y-m-d'); // 2025-04-14 (следующий понедельник)
$date->modify('first day of next month');
echo $date->format('Y-m-d'); // 2025-05-01
2025-04-14
2025-05-01

Работа с периодами: генерация списка дат между двумя значениями

Пример

$start = new DateTime('2025-04-10');
$end = new DateTime('2025-04-15');
$interval = new DateInterval('P1D');
$period = new DatePeriod($start, $interval, $end);
foreach ($period as $date) {
   echo $date->format('Y-m-d') . ' ';
}
2025-04-10 2025-04-11 2025-04-12 2025-04-13 2025-04-14

Преобразование дат в PHP - comments

En
Php преобразовать даты (php)