Работа с датами и временем в PHP: от основ до продвинутых приемов
Работа с датами и временем — одна из самых частых задач в веб-разработке. Будь то вывод текущей даты, расчет разницы между событиями или сохранение временных меток в базе данных — PHP предоставляет мощный и гибкий инструментарий. В этой статье мы подробно разберем основные функции, классы и лучшие практики работы с датами и временем в PHP.
Материал будет полезен как новичкам, только начинающим изучать PHP, так и опытным разработчикам, желающим систематизировать знания.
1. Основные функции: date(), time() и mktime()
Начнем с фундамента. PHP предлагает несколько встроенных функций для работы с датами. Самые популярные из них — date(), time() и mktime().
Функция time()
Функция time() возвращает текущую метку времени Unix (timestamp) — количество секунд, прошедших с 1 января 1970 года 00:00:00 UTC. Это базовое значение, от которого отталкиваются многие операции.
echo time(); // Выведет что-то вроде 1698765432
Функция date()
Функция date() форматирует локальную дату и время. Первый параметр — строка формата, второй (необязательный) — timestamp. Если второй параметр не указан, используется текущее время.
// Основные форматы
echo date("Y-m-d"); // 2023-10-31
echo date("H:i:s"); // 14:30:00
echo date("d.m.Y H:i"); // 31.10.2023 14:30
echo date("l, j F Y"); // Tuesday, 31 October 2023
// Собственный timestamp
$timestamp = mktime(12, 0, 0, 1, 1, 2024);
echo date("Y-m-d H:i:s", $timestamp); // 2024-01-01 12:00:00
Популярные символы форматирования:
d— день месяца (01-31)m— месяц (01-12)Y— год в 4-значном форматеH— часы (00-23)i— минуты (00-59)s— секунды (00-59)
Функция mktime()
mktime() создает timestamp на основе переданных параметров (часы, минуты, секунды, месяц, день, год). Это удобно для получения метки конкретной даты.
// Создаем timestamp для 25 декабря 2023 года, 10:30:00
$christmas = mktime(10, 30, 0, 12, 25, 2023);
echo date("d.m.Y H:i:s", $christmas); // 25.12.2023 10:30:00
2. Объектно-ориентированный подход: класс DateTime
Хотя функции date() и time() просты, они имеют ограничения. Для более сложных операций (сравнение дат, работа с временными зонами, сложение/вычитание интервалов) лучше использовать класс DateTime.
Создание объектов DateTime
// Текущее время
$now = new DateTime();
echo $now->format("Y-m-d H:i:s"); // 2023-10-31 14:30:00
// Конкретная дата
$date = new DateTime("2024-03-15 08:00:00");
echo $date->format("d.m.Y"); // 15.03.2024
// Относительные форматы
$nextWeek = new DateTime("+1 week");
echo $nextWeek->format("Y-m-d");
$lastMonth = new DateTime("first day of last month");
echo $lastMonth->format("Y-m-d");
Работа с временными зонами
Одно из главных преимуществ DateTime — поддержка временных зон.
// Указываем временную зону при создании
$moscow = new DateTime("now", new DateTimeZone("Europe/Moscow"));
echo $moscow->format("Y-m-d H:i:s"); // Московское время
// Изменение временной зоны
$newYork = new DateTime("now", new DateTimeZone("America/New_York"));
echo $newYork->format("Y-m-d H:i:s"); // Нью-Йоркское время
// Список доступных зон: https://www.php.net/manual/ru/timezones.php
Сравнение дат
$date1 = new DateTime("2024-01-01");
$date2 = new DateTime("2024-12-31");
if ($date1 < $date2) {
echo "Первая дата раньше второй";
}
// Разница между датами
$diff = $date1->diff($date2);
echo $diff->days; // 365
echo $diff->format("%m месяцев, %d дней"); // 11 месяцев, 30 дней
Изменение дат: modify, add, sub
$date = new DateTime("2024-01-01");
// Добавляем 10 дней
$date->modify("+10 days");
echo $date->format("Y-m-d"); // 2024-01-11
// Используем DateInterval
$interval = new DateInterval("P2M15D"); // 2 месяца 15 дней
$date->add($interval);
echo $date->format("Y-m-d"); // 2024-03-26
// Вычитание
$date->sub(new DateInterval("P1M"));
echo $date->format("Y-m-d"); // 2024-02-26
3. Парсинг строк: strtotime() и createFromFormat()
Часто даты приходят из внешних источников (формы, API, базы данных) в виде строк. Для их преобразования в timestamp или объект DateTime используются strtotime() и DateTime::createFromFormat().
Функция strtotime()
Умеет "понимать" текстовые описания дат.
$timestamp = strtotime("next Monday");
echo date("Y-m-d", $timestamp);
$timestamp = strtotime("last day of february 2024");
echo date("Y-m-d", $timestamp); // 2024-02-29 (високосный год)
$timestamp = strtotime("+2 weeks 3 days");
echo date("Y-m-d", $timestamp); // Через 17 дней от сегодня
Внимание: strtotime() работает только с английскими текстовыми форматами. Для