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

«Какие функции и классы для работы с датой и временем в PHP вы используете?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В современном 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 и серверным временем.