
В PHP работа с датой и временем реализована через объект DateTime и функцию date(). Эти инструменты позволяют не только получать текущую дату, но и гибко изменять её формат в зависимости от требований локализации, хранения или отображения.
Функция date($format, $timestamp) возвращает строку, отформатированную по заданному шаблону. Например, date("d.m.Y") вернёт 04.05.2025. Для получения формата 2025-05-04 используется шаблон "Y-m-d".
Для работы с произвольными датами рекомендуется использовать объект DateTime. Он поддерживает методы format(), modify() и setTimezone(). Например: (new DateTime("2025-05-04"))->format("d/m/Y") выдаст 04/05/2025. Это особенно полезно при необходимости преобразования даты из формата базы данных в формат пользовательского интерфейса.
При получении даты из внешних источников, таких как формы или API, важно учитывать локальные различия. В США часто используется формат m/d/Y, в то время как в Европе – d.m.Y. Преобразование осуществляется через DateTime::createFromFormat(). Пример: DateTime::createFromFormat("m/d/Y", "05/04/2025")->format("Y-m-d") вернёт 2025-05-04.
При генерации даты для хранения в базе данных рекомендуется использовать формат Y-m-d H:i:s. Он соответствует стандарту DATETIME в MySQL и обеспечивает корректную сортировку и фильтрацию.
Как получить текущую дату в нужном формате с помощью функции date()

<?php
echo date("d.m.Y");
?>
Если требуется ISO-формат гггг-мм-дд, применяйте:
<?php
echo date("Y-m-d");
?>
Для отображения даты и времени вместе, например 01.05.2025 14:30:
<?php
echo date("d.m.Y H:i");
?>
Формат можно адаптировать под любые требования. Примеры:
date("j F Y")– 1 Май 2025date("D, d M Y")– Sat, 04 May 2025date("H:i:s")– 14:30:00
Убедитесь, что указана нужная временная зона. Это делается через date_default_timezone_set():
<?php
date_default_timezone_set("Europe/Moscow");
echo date("d.m.Y H:i");
?>
Без этого сервер может вернуть неверное время, особенно при работе на хостингах с другой географией.
Форматирование даты из строки с использованием функции strtotime()
Пример: строка "10 March 2023 14:30" преобразуется вызовом strtotime("10 March 2023 14:30"). Возвращённая метка может быть отформатирована так: date("d.m.Y H:i", strtotime("10 March 2023 14:30")), результат – 10.03.2023 14:30.
Функция поддерживает гибкие конструкции: strtotime("next Monday"), "-1 day", "+2 weeks", "first day of next month". Это удобно для вычисления дат без ручного расчёта.
При использовании строкового ввода из внешних источников (например, форм или API) необходимо убедиться в валидности значения. Если strtotime() не может интерпретировать строку, он возвращает false. Для проверки корректности преобразования используйте конструкцию: if (strtotime($input) !== false).
Функция чувствительна к локали сервера. Строки на русском языке ("10 марта 2023") не обрабатываются без предварительной установки соответствующей локали через setlocale().
Не используйте strtotime() с неконтролируемыми пользовательскими строками без предварительной очистки: возможны ошибки при вводе, которые приведут к неверной интерпретации или сбоям.
Преобразование даты из базы данных MySQL в читаемый формат

MySQL чаще всего хранит дату в формате YYYY-MM-DD или YYYY-MM-DD HH:MM:SS. Такой формат удобен для обработки, но не подходит для отображения пользователю. Для преобразования используется функция date() в связке с strtotime().
- Получение даты из базы данных:
$row = mysqli_fetch_assoc($result); $rawDate = $row['created_at']; - Преобразование в формат «день.месяц.год»:
$formattedDate = date("d.m.Y", strtotime($rawDate)); - Формат с указанием времени:
$formattedDateTime = date("d.m.Y H:i", strtotime($rawDate));
$formatted = date("d F Y", strtotime($rawDate));
Для русского языка необходимо установить локаль:
setlocale(LC_TIME, 'ru_RU.UTF-8');
echo strftime("%d %B %Y", strtotime($rawDate));
В случае использования PDO преобразование идентично. Рекомендуется избегать форматирования даты в SQL-запросе, так как это снижает гибкость отображения на уровне PHP.
Не используйте date() без strtotime(), если переменная содержит строку из MySQL – это приведёт к некорректным результатам.
Форматирование даты через объект DateTime и метод format()
- Создание объекта:
$date = new DateTime('2025-05-04 14:30:00'); - Получение даты в формате «день.месяц.год»:
$date->format('d.m.Y');→04.05.2025 - Формат с названием месяца:
$date->format('j F Y');→4 May 2025 - Дата и время с секундами:
$date->format('Y-m-d H:i:s');→2025-05-04 14:30:00
Работа с текущим временем:
$now = new DateTime();
echo $now->format('d.m.Y H:i');
Создание даты из строки:
$date = DateTime::createFromFormat('d-m-Y', '04-05-2025');
echo $date->format('Y/m/d');
Изменение формата даты с учётом временной зоны

Для работы с временными зонами в PHP используется класс DateTimeZone в связке с DateTime. Это позволяет не только корректно отображать дату и время, но и точно конвертировать их между зонами.
Создание объекта с указанием временной зоны:
$date = new DateTime('2025-05-04 14:00:00', new DateTimeZone('UTC'));
Изменение временной зоны после создания объекта:
$date->setTimezone(new DateTimeZone('Europe/Moscow'));
echo $date->format('Y-m-d H:i:s');
Если необходимо вывести дату в нескольких временных зонах, следует клонировать объект, чтобы не потерять исходное значение:
$original = new DateTime('now', new DateTimeZone('UTC'));
$moscow = clone $original;
$moscow->setTimezone(new DateTimeZone('Europe/Moscow'));
$tokyo = clone $original;
$tokyo->setTimezone(new DateTimeZone('Asia/Tokyo'));
echo 'UTC: ' . $original->format('Y-m-d H:i:s') . "\n";
echo 'Moscow: ' . $moscow->format('Y-m-d H:i:s') . "\n";
echo 'Tokyo: ' . $tokyo->format('Y-m-d H:i:s');
Список поддерживаемых временных зон можно получить с помощью:
$zones = DateTimeZone::listIdentifiers();
При работе с пользовательскими датами важно задавать временную зону явно. Установка зоны по умолчанию:
date_default_timezone_set('Europe/Berlin');
Это влияет на функции date(), time(), strtotime() и другие, использующие системную временную зону. Не устанавливая её явно, можно получить несоответствия при форматировании или сравнении дат.
Первым шагом необходимо установить локаль с помощью функции setlocale(). Для русского языка на большинстве серверов используется локаль ru_RU.UTF-8. Установка локали может выглядеть так:
setlocale(LC_TIME, 'ru_RU.UTF-8');
После установки локали для работы с датой используется функция strftime(), которая позволяет форматировать дату в соответствии с указанными параметрами. Например, чтобы вывести текущую дату в формате «день месяц год» на русском языке, можно использовать следующий код:
echo strftime('%d %B %Y');
Также можно изменять формат даты, добавляя, например, день недели. Чтобы вывести дату с названием дня недели, используйте следующий код:
echo strftime('%A, %d %B %Y');
Для текущей даты результат будет таким: воскресенье, 04 мая 2025. В данном примере %A представляет собой полное название дня недели.
echo strftime('%d %B %Y, %H:%M:%S');
Этот код выведет дату и время в формате «04 мая 2025, 14:30:45».
Если на сервере не установлена нужная локаль или она недоступна, PHP может вывести ошибку или просто не отобразить текст на русском языке. В таком случае можно попытаться установить другую локаль, например, ru_RU.CP1251, если сервер поддерживает кодировку Windows-1251. Однако лучший вариант – это наличие поддерживаемой локали с UTF-8.
Преобразование пользовательского ввода даты в формат для хранения
Когда данные о дате поступают от пользователя, важно преобразовать их в унифицированный формат, подходящий для хранения в базе данных. Чаще всего используется формат YYYY-MM-DD, так как он стандартизирован и легко обрабатывается большинством СУБД.
Для того чтобы преобразовать дату из пользовательского ввода в нужный формат, можно использовать функцию strtotime(), которая парсит строку в дату. Например, если пользователь ввёл дату в формате день.месяц.год, можно выполнить следующее преобразование:
$user_input = '25.12.2025';
$date = DateTime::createFromFormat('d.m.Y', $user_input);
$formatted_date = $date->format('Y-m-d');
Здесь используется метод createFromFormat для указания точного формата ввода, что позволяет избежать ошибок при парсинге. После этого метод format преобразует дату в формат Y-m-d, подходящий для хранения.
Если пользователь вводит дату в различных форматах, таких как 25/12/2025 или 2025-12-25, перед преобразованием можно использовать регулярные выражения для нормализации строки. Важно предусмотреть проверку на корректность ввода, чтобы избежать ошибок при дальнейшем использовании данных.
Для более сложных случаев можно применять библиотеку Carbon, которая предоставляет дополнительные функции для работы с датами и временем. Например:
use Carbon\Carbon;
$user_input = '25/12/2025';
$date = Carbon::createFromFormat('d/m/Y', $user_input);
$formatted_date = $date->toDateString();
Использование Carbon позволяет упростить работу с датами, добавляя гибкость при обработке различных форматов ввода. Но важно помнить, что с любым вводом следует работать аккуратно, проверяя его на корректность перед преобразованием и хранением.
Разбор ошибок при форматировании дат и способы их устранения

При работе с функциями форматирования дат в PHP часто возникают ошибки, которые связаны как с неправильным синтаксисом, так и с неправильной обработкой форматов. Разберём основные ошибки и способы их устранения.
Ошибка: Неправильный формат строки даты
Часто при использовании функции date() или DateTime::format() разработчики указывают неверные символы формата. Например, если указать 'Y-m-d', а затем использовать формат 'y-m-d', то дата будет выведена с ошибкой, так как y означает двухзначный год, а Y – четырёхзначный. Для правильной работы необходимо внимательно проверять спецификаторы формата.
Решение: Проверьте символы формата, которые вы используете. Например:
Y – четырёхзначный год
y – двухзначный год
m – месяц (с ведущим нулём)
d – день месяца (с ведущим нулём)
Ошибка: Использование функции date() без установки временной зоны
PHP использует временную зону сервера по умолчанию, что может привести к ошибочному отображению даты, если на сервере установлена некорректная временная зона. Для корректного форматирования времени и даты важно явно указать временную зону.
Решение: Установите временную зону с помощью date_default_timezone_set():
date_default_timezone_set('Europe/Moscow');
Ошибка: Неправильное использование функции strtotime()
Функция strtotime() может не корректно интерпретировать строки, если дата указана в неправильном формате или если локаль сервера не поддерживает нужный формат. Проблемы могут возникнуть, например, при указании даты в формате dd/mm/yyyy на сервере с американской локалью, где ожидается формат mm/dd/yyyy.
Решение: Убедитесь, что строка даты соответствует ожидаемому формату, или используйте функцию DateTime::createFromFormat(), чтобы явно указать формат даты:
$date = DateTime::createFromFormat('d/m/Y', '25/12/2025');
Ошибка: Невозможность работы с неверными датами
PHP может не корректно обрабатывать несуществующие даты, такие как 30 февраля или 31 июня. Это может привести к неожиданному поведению функций форматирования.
Решение: Для проверки валидности даты используйте функцию checkdate(), которая возвращает true, если дата существует, и false, если нет:
if (checkdate(2, 30, 2025)) {
echo 'Дата правильная.';
} else {
echo 'Ошибка в дате.';
}
Ошибка: Использование формата, не поддерживаемого в текущей версии PHP
Не все форматы поддерживаются во всех версиях PHP. Например, P (период времени) был добавлен в PHP 5.3, а использование форматов, введённых в более поздних версиях, на старых версиях PHP приведет к ошибке.
Решение: Обратите внимание на требования к версии PHP и убедитесь, что используемый формат поддерживается. Для старых версий PHP можно использовать другие методы для работы с временем и датой.
Ошибка: Неявное преобразование типов
При работе с датами часто возникает проблема, когда строка или объект преобразуется в неверный тип. Например, попытка форматирования строки, которая не является датой, вызовет ошибку или неверный результат.
Решение: Перед форматированием всегда убедитесь, что объект является экземпляром класса DateTime, и используйте соответствующие методы для обработки строк:
$date = new DateTime('2025-12-25');
echo $date->format('Y-m-d');
Устранение этих ошибок требует внимания к деталям, но с правильным подходом к обработке форматов и временнЫх зон работа с датами в PHP станет гораздо проще и предсказуемее.
