Ответ
В современном PHP работа с датами строится вокруг объектно-ориентированного расширения DateTime. Старые процедурные функции (date(), strtotime()) я использую редко, только для простейших случаев.
1. Основные классы (DateTime Extension)
-
DateTime— центральный класс для представления даты и времени.$now = new DateTime(); // Текущее время $specificDate = new DateTime('2024-01-15 14:30:00'); $fromTimestamp = (new DateTime())->setTimestamp(1673787600); -
DateTimeImmutable— предпочтительная неизменяемая версия. Любая операция возвращает новый объект, что предотвращает случайные мутации.$date = new DateTimeImmutable('today'); $tomorrow = $date->modify('+1 day'); // $date остался «сегодня» -
DateInterval— представляет интервал (разницу между датами).$interval = new DateInterval('P1M2D'); // Период: 1 месяц, 2 дня $newDate = $now->add($interval); -
DatePeriod— позволяет итерироваться по периоду.$start = new DateTime('2024-01-01'); $interval = new DateInterval('P1W'); // Интервал в 1 неделю $end = new DateTime('2024-02-01'); $period = new DatePeriod($start, $interval, $end); foreach ($period as $date) { echo $date->format('Y-m-d') . "n"; // Выведет все понедельники } -
DateTimeZone— работа с часовыми поясами. Критически важно всегда явно указывать таймзону.$utc = new DateTimeZone('UTC'); $moscow = new DateTimeZone('Europe/Moscow'); $date = new DateTime('now', $utc); $date->setTimezone($moscow); // Конвертация времени
2. Ключевые методы DateTime/DateTimeImmutable
format()— вывод в строку.echo $date->format('Y-m-dTH:i:sP'); // ISO 8601 форматmodify()— изменение даты строковым выражением.$date->modify('first day of next month');add()/sub()— прибавление/вычитаниеDateInterval.diff()— вычисление разницы между двумя датами, возвращаетDateInterval.$diff = $date1->diff($date2); echo $diff->days; // Полное количество дней разницы echo $diff->format('%y years, %m months');
3. Полезные процедурные функции (использую как вспомогательные)
strtotime()— быстрый парсинг строки в timestamp, если не нужен объект.date()иidate()— быстрое форматирование текущего времени.time()— текущий Unix timestamp.checkdate()— проверка корректности даты (месяц, день, год).
4. Библиотеки для сложных случаев Для очень сложной логики (работа с праздниками, бизнес-датами) использую Carbon (надстройка над DateTime), которая предоставляет удобный fluent-интерфейс и множество хелперов.
Главное правило: Всегда работайте с DateTimeImmutable и явно указывайте часовой пояс, чтобы избежать ошибок, связанных с DST и серверным временем.