Какие функции и классы для работы с датой и временем в 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 и серверным временем.

Ответ 18+ 🔞

Ну, вот смотри, в современном PHP с датами всё как у взрослых — через объекты, а не эти древние функции, которые будто из 2002-го года вылезли. 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'); // Период: месяц и два дня, хуй с горы
    $newDate = $now->add($interval);
  • DatePeriod — позволяет тупо пройтись по периоду, как по массиву.

    $start = new DateTime('2024-01-01');
    $interval = new DateInterval('P1W'); // Раз в неделю
    $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 и явно указывай часовой пояс. Иначе однажды проснёшься, а у тебя из-за летнего времени или настроек сервера всё ебнулось, и ты сам от себя охуеешь.