PHP: управление временными данными от А до Я

Раздел: 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, 2025
Thursday, 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-01

5. Сравнение объектов 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); // 165

6. Использование 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:00

7. Работа с микросекундами

Пример
$now = new DateTime();
echo $now->format('Y-m-d H:i:s.u'); // 2025-04-10 14:30:00.123456

8. Получение и установка timestamp

Пример
$date = new DateTime();
$timestamp = $date->getTimestamp();
echo $timestamp; // 1744293000
$date->setTimestamp(1744293000);
echo $date->format('Y-m-d');

данные PHP (datum) - comments

En
Datum php (php)