PHP: управление временными данными от А до Я
Основы работы с датами и временем в PHP
Как создать и использовать объект DateTime?
Наиболее гибким и современным способом работы с датами является класс DateTime. Он предоставляет объектно-ориентированный интерфейс для создания, форматирования, изменения и сравнения дат.
<?php
$date = new DateTime(); // текущая дата и время
echo $date->format('Y-m-d H:i:s');
?>Datum php (данные php (datum))
2025-04-10 14:30:00
Пояснение: конструктор без аргументов создаёт объект с текущим моментом. Метод format() выводит дату по заданному шаблону (год-месяц-день часы:минуты:секунды).
Для создания даты из строки используйте второй аргумент:
$date2 = new DateTime('2025-12-31 23:59:59');
echo $date2->format('d.m.Y');31.12.2025
Типичная ошибка
Неправильный формат строки вызывает исключение. Например, '2025/12/31' может быть не принят. Используйте createFromFormat() для нестандартных форматов:
$date3 = DateTime::createFromFormat('d/m/Y', '31/12/2025');
echo $date3->format('Y-m-d');2025-12-31
Как получить текущую дату в виде строки?
Функция date() возвращает отформатированную строку на основе временной метки (timestamp). Она проста, но не позволяет легко манипулировать датой.
echo date('Y-m-d H:i:s'); // 2025-04-10 14:30:00
echo date('l, F j, Y'); // Thursday, April 10, 2025Thursday, April 10, 2025
Пояснение: первый аргумент - формат, второй (необязательный) - timestamp. Без второго используется текущее время.
Проблема
Функция date() зависит от временной зоны, установленной в php.ini или через date_default_timezone_set(). Неправильная зона ведёт к смещению.
Как создать временную метку для заданной даты?
Функция mktime() создаёт Unix timestamp для указанных компонентов (часы, минуты, секунды, месяц, день, год).
$timestamp = mktime(0, 0, 0, 12, 25, 2025); // 25 декабря 2025 00:00:00
echo date('Y-m-d', $timestamp);2025-12-25
Пояснение: порядок аргументов: часы, минуты, секунды, месяц, день, год. Пропущенные аргументы берутся из текущего времени.
Ошибка
Передача невалидных значений (например, месяц 13) приводит к автоматическому пересчёту, что может дать неожиданную дату. Проверяйте диапазоны.
Как преобразовать строку с датой в timestamp?
strtotime() интерпретирует английские текстовые описания дат в timestamp.
echo strtotime('next Monday');
echo strtotime('+1 week');
echo strtotime('2025-12-31 23:59:59');1744243200 (примерно) 1744848000 1767225599
Пояснение: функция понимает множество форматов: 'now', 'yesterday', 'last day of next month' и т.д. Возвращает false при ошибке.
Типичная ошибка
Региональные строки (например, 'следующий понедельник' на русском) не распознаются. Используйте английские фразы или проверяйте результат на false.
Расширенные примеры работы с датами и временем в PHP:
1. Работа с временными зонами
$utc = new DateTime('now', new DateTimeZone('UTC'));
$msk = new DateTime('now', new DateTimeZone('Europe/Moscow'));
echo 'UTC: ' . $utc->format('Y-m-d H:i:s') . PHP_EOL;
echo 'MSK: ' . $msk->format('Y-m-d H:i:s');UTC: 2025-04-10 11:30:00 MSK: 2025-04-10 14:30:00
Установка временной зоны по умолчанию:
date_default_timezone_set('America/New_York');
echo date('Y-m-d H:i:s');2. Разница между датами (DateInterval)
$start = new DateTime('2025-01-01');
$end = new DateTime('2025-12-31');
$diff = $start->diff($end);
echo $diff->days . ' дней'; // 364
echo $diff->format('%Y лет, %m месяцев, %d дней');364 дней 0 лет, 11 месяцев, 30 дней
3. Итерация по диапазону дат (DatePeriod)
$start = new DateTime('2025-12-01');
$end = (new DateTime('2025-12-05'))->modify('+1 day'); // включительно
$interval = new DateInterval('P1D');
$period = new DatePeriod($start, $interval, $end);
foreach ($period as $date) {
echo $date->format('Y-m-d') . PHP_EOL;
}2025-12-01 2025-12-02 2025-12-03 2025-12-04 2025-12-05
4. Изменение даты с помощью modify
$date = new DateTime('2025-04-10');
echo $date->modify('+2 months')->format('Y-m-d'); // 2025-06-10
echo $date->modify('first day of next month')->format('Y-m-d'); // 2025-05-015. Сравнение объектов DateTime
$d1 = new DateTime('2025-01-01');
$d2 = new DateTime('2025-06-15');
var_dump($d1 < $d2); // bool(true)
var_dump($d1 == $d2); // bool(false)
var_dump($d1->diff($d2)->days); // 1656. Использование createFromFormat для произвольного формата
$dateStr = '15/Jan/2025:12:30:00 +0300';
$format = 'd/M/Y:H:i:s O';
$date = DateTime::createFromFormat($format, $dateStr);
echo $date->format('Y-m-d H:i:s'); // 2025-01-15 12:30:007. Работа с микросекундами
$now = new DateTime();
echo $now->format('Y-m-d H:i:s.u'); // 2025-04-10 14:30:00.1234568. Получение и установка timestamp
$date = new DateTime();
$timestamp = $date->getTimestamp();
echo $timestamp; // 1744293000
$date->setTimestamp(1744293000);
echo $date->format('Y-m-d');