Введение: зачем уметь работать с датами и временем в PHP
Работа с датами и временем — одна из ключевых задач в веб-разработке. Будь то логирование действий пользователя, расчет возраста, создание календарей, обработка временных меток из базы данных или управление сроками подписки — без надежных инструментов для работы с датами не обойтись. PHP предоставляет разработчикам мощный и гибкий набор функций и классов для этих целей.
В этой статье мы подробно разберем основные способы работы с датами и временем в PHP: от простых функций date() и time() до объектно-ориентированного подхода с использованием класса DateTime. Вы узнаете, как форматировать даты, вычислять разницу между ними, работать с временными зонами и избегать типичных ошибок.
Основные функции: date(), time() и mktime()
Самый простой способ получить текущую дату или время в PHP — использовать функцию date(). Она принимает строку формата и опционально метку времени (timestamp). Если метка не передана, используется текущее время.
<?php
// Текущая дата в формате "Год-Месяц-День"
echo date('Y-m-d'); // Вывод: 2025-04-10
// Текущее время в формате "Часы:Минуты:Секунды"
echo date('H:i:s'); // Вывод: 14:35:20
// Полная дата и время
echo date('Y-m-d H:i:s'); // Вывод: 2025-04-10 14:35:20
?>
Функция time()
time() возвращает текущую метку времени Unix (количество секунд, прошедших с 1 января 1970 года). Это полезно для расчетов и сравнений.
<?php
$now = time();
echo $now; // Вывод: 1744277720 (число меняется каждую секунду)
// Дата через 7 дней
$nextWeek = time() + (7 * 24 * 60 * 60);
echo date('Y-m-d', $nextWeek); // Вывод: 2025-04-17
?>
Функция mktime()
mktime() позволяет создать метку времени для конкретной даты и времени. Это удобно, когда нужно получить timestamp для заданных параметров.
<?php
// Создаем метку времени для 25 декабря 2025 года, 10:00:00
$christmas = mktime(10, 0, 0, 12, 25, 2025);
echo date('Y-m-d H:i:s', $christmas); // Вывод: 2025-12-25 10:00:00
?>
Форматирование дат: основные символы
В таблице ниже приведены наиболее часто используемые символы форматирования для функции date():
- d — день месяца (01–31)
- m — номер месяца (01–12)
- Y — год в 4-значном формате (2025)
- H — часы в 24-часовом формате (00–23)
- i — минуты (00–59)
- s — секунды (00–59)
- l — полное название дня недели (Monday)
- F — полное название месяца (April)
Объектно-ориентированный подход: класс DateTime
Начиная с PHP 5.2, рекомендуется использовать класс DateTime для работы с датами. Он предоставляет гораздо больше возможностей и интуитивно понятный интерфейс.
Создание объекта DateTime
<?php
// Текущая дата и время
$date = new DateTime();
echo $date->format('Y-m-d H:i:s'); // Вывод: 2025-04-10 14:35:20
// Конкретная дата
$birthday = new DateTime('1990-07-15');
echo $birthday->format('d.m.Y'); // Вывод: 15.07.1990
// С относительным форматом
$nextMonth = new DateTime('+1 month');
echo $nextMonth->format('Y-m-d'); // Вывод: 2025-05-10
?>
Модификация дат
Метод modify() позволяет легко изменять дату с помощью относительных строк.
<?php
$date = new DateTime('2025-04-10');
$date->modify('+10 days');
echo $date->format('Y-m-d'); // Вывод: 2025-04-20
$date->modify('first day of next month');
echo $date->format('Y-m-d'); // Вывод: 2025-05-01
?>
Разница между датами: DateInterval
Для вычисления разницы между двумя датами используется метод diff(), который возвращает объект DateInterval.
<?php
$start = new DateTime('2025-01-01');
$end = new DateTime('2025-12-31');
$interval = $start->diff($end);
echo $interval->days; // Вывод: 364 (количество дней)
echo $interval->format('%m месяцев, %d дней'); // Вывод: 11 месяцев, 30 дней
?>
Работа с временными зонами (Timezones)
Игнорирование временных зон — одна из самых распространенных ошибок при работе с датами. PHP позволяет легко управлять часовыми поясами.
Установка временной зоны по умолчанию
Глобально временную зону можно задать в файле php.ini или с помощью функции date_default_timezone_set().
<?php
// Устанавливаем московское время
date_default_timezone_set('Europe/Moscow');
echo date('Y-m-d H:i:s'); // Время с учетом часового пояса
// Список поддерживаемых зон: https://www.php.net/manual/ru/timezones.php
?>
DateTime и временные зоны
При создании объекта DateTime можно указать временную зону. Также её можно изменить с помощью метода setTimezone().
<?php
// Создаем объект с явным указанием зоны
$date = new DateTime('now', new DateTimeZone('America/New_York'));
echo $date->format('Y-m-d H:i:s'); // Время в Нью-