Работа с датами и временем в PHP: от А до Я
Работа с датами и временем — одна из самых частых задач в веб-разработке. Будь то вывод даты публикации, расчет возраста пользователя, логирование событий или создание календаря — PHP предоставляет мощный и гибкий инструментарий. В этой статье мы разберем все аспекты: от простых функций до объектно-ориентированного подхода с классом DateTime, включая временные зоны и практические примеры.
Основные функции: date() и time()
Базовый набор функций для работы с датами включает time() и date(). Функция time() возвращает текущую метку времени Unix (количество секунд с 1 января 1970 года). Функция date() форматирует эту метку в человекочитаемый вид.
Получение текущей даты и времени
Самый простой способ вывести текущую дату:
<?php
echo date('Y-m-d H:i:s'); // 2025-04-10 15:30:45
?>
Форматирование с помощью date()
Функция date() принимает два параметра: формат и необязательную метку времени. Наиболее популярные символы форматирования:
d— день месяца (01–31)m— месяц (01–12)Y— год в 4-значном форматеH— часы в 24-часовом формате (00–23)i— минуты (00–59)s— секунды (00–59)
Пример вывода с русским текстом:
<?php
echo 'Сегодня ' . date('d.m.Y') . ' года, время ' . date('H:i');
// Сегодня 10.04.2025 года, время 15:30
?>
Класс DateTime: объектно-ориентированный подход
Для сложных операций рекомендуется использовать класс DateTime. Он интуитивно понятен, поддерживает временные зоны и упрощает манипуляции с датами.
Создание объекта DateTime
Создать объект можно разными способами:
<?php
// Текущая дата и время
$now = new DateTime();
echo $now->format('Y-m-d H:i:s'); // 2025-04-10 15:30:45
// Конкретная дата
$date = new DateTime('2025-12-31 23:59:59');
echo $date->format('d.m.Y'); // 31.12.2025
// С использованием относительного формата
$nextWeek = new DateTime('+1 week');
echo $nextWeek->format('Y-m-d');
?>
Изменение даты: modify()
Метод modify() позволяет легко добавлять или вычитать интервалы:
<?php
$date = new DateTime('2025-04-10');
$date->modify('+10 days');
echo $date->format('d.m.Y'); // 20.04.2025
$date->modify('-1 month');
echo $date->format('d.m.Y'); // 20.03.2025
?>
Работа с временными зонами
Игнорирование временных зон — частая ошибка. PHP предлагает два способа управления ими: глобально через date_default_timezone_set() и локально через объект DateTimeZone.
Глобальная настройка
Установите временную зону в начале скрипта:
<?php
date_default_timezone_set('Europe/Moscow');
echo date('H:i'); // Время по Москве
?>
Локальная настройка для DateTime
Каждый объект DateTime может иметь свою временную зону:
<?php
$timezone = new DateTimeZone('Asia/Vladivostok');
$date = new DateTime('now', $timezone);
echo $date->format('H:i'); // Время во Владивостоке
// Смена зоны у существующего объекта
$date->setTimezone(new DateTimeZone('Europe/Moscow'));
echo $date->format('H:i'); // Конвертированное время
?>
Разница между датами: DateInterval
Класс DateInterval и метод diff() позволяют вычислять разницу между двумя датами.
Вычисление разницы
<?php
$start = new DateTime('2025-01-01');
$end = new DateTime('2025-12-31');
$interval = $start->diff($end);
echo $interval->days; // 364 (количество дней)
echo $interval->format('%m месяцев, %d дней'); // 11 месяцев, 30 дней
?>
Добавление интервала
<?php
$date = new DateTime('2025-04-10');
$interval = new DateInterval('P10D'); // 10 дней
$date->add($interval);
echo $date->format('d.m.Y'); // 20.04.2025
// Вычитание
$date->sub(new DateInterval('P1M')); // минус 1 месяц
echo $date->format('d.m.Y'); // 20.03.2025
?>
Формат DateInterval начинается с буквы P (period): P10D — 10 дней, P1Y2M3DT4H5M6S — 1 год, 2 месяца, 3 дня, 4 часа, 5 минут, 6 секунд.
Практические примеры
Преобразование строки в дату
Функция strtotime() преобразует текстовое описание в метку времени:
<?php
$timestamp = strtotime('next Monday');
echo date('d.m.Y', $timestamp); // Дата следующего понедельника
$timestamp = strtotime('last day of February 2025');
echo date('d.m.Y', $timestamp); // 28.02.2025
?>
Проверка корректности даты
Функция checkdate() проверяет, существует ли дата:
<?php
var_dump(checkdate(2, 29, 2024)); // true (високосный год)
var_dump(checkdate(2, 29, 2025));