Ответ
В современном 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 и явно указывай часовой пояс. Иначе однажды проснёшься, а у тебя из-за летнего времени или настроек сервера всё ебнулось, и ты сам от себя охуеешь.