Работа с датами и временем в PHP: функции, классы и примеры

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с датами и временем в PHP: от основ до продвинутых приемов

Работа с датами и временем — одна из самых частых задач в веб-разработке. Будь то вывод текущей даты, расчет разницы между событиями или сохранение временных меток в базе данных — PHP предоставляет мощный и гибкий инструментарий. В этой статье мы подробно разберем основные функции, классы и лучшие практики работы с датами и временем в PHP.

Материал будет полезен как новичкам, только начинающим изучать PHP, так и опытным разработчикам, желающим систематизировать знания.

1. Основные функции: date(), time() и mktime()

Начнем с фундамента. PHP предлагает несколько встроенных функций для работы с датами. Самые популярные из них — date(), time() и mktime().

Функция time()

Функция time() возвращает текущую метку времени Unix (timestamp) — количество секунд, прошедших с 1 января 1970 года 00:00:00 UTC. Это базовое значение, от которого отталкиваются многие операции.

echo time(); // Выведет что-то вроде 1698765432

Функция date()

Функция date() форматирует локальную дату и время. Первый параметр — строка формата, второй (необязательный) — timestamp. Если второй параметр не указан, используется текущее время.

// Основные форматы
echo date("Y-m-d");          // 2023-10-31
echo date("H:i:s");          // 14:30:00
echo date("d.m.Y H:i");      // 31.10.2023 14:30
echo date("l, j F Y");       // Tuesday, 31 October 2023

// Собственный timestamp
$timestamp = mktime(12, 0, 0, 1, 1, 2024);
echo date("Y-m-d H:i:s", $timestamp); // 2024-01-01 12:00:00

Популярные символы форматирования:

  • d — день месяца (01-31)
  • m — месяц (01-12)
  • Y — год в 4-значном формате
  • H — часы (00-23)
  • i — минуты (00-59)
  • s — секунды (00-59)

Функция mktime()

mktime() создает timestamp на основе переданных параметров (часы, минуты, секунды, месяц, день, год). Это удобно для получения метки конкретной даты.

// Создаем timestamp для 25 декабря 2023 года, 10:30:00
$christmas = mktime(10, 30, 0, 12, 25, 2023);
echo date("d.m.Y H:i:s", $christmas); // 25.12.2023 10:30:00

2. Объектно-ориентированный подход: класс DateTime

Хотя функции date() и time() просты, они имеют ограничения. Для более сложных операций (сравнение дат, работа с временными зонами, сложение/вычитание интервалов) лучше использовать класс DateTime.

Создание объектов DateTime

// Текущее время
$now = new DateTime();
echo $now->format("Y-m-d H:i:s"); // 2023-10-31 14:30:00

// Конкретная дата
$date = new DateTime("2024-03-15 08:00:00");
echo $date->format("d.m.Y"); // 15.03.2024

// Относительные форматы
$nextWeek = new DateTime("+1 week");
echo $nextWeek->format("Y-m-d");

$lastMonth = new DateTime("first day of last month");
echo $lastMonth->format("Y-m-d");

Работа с временными зонами

Одно из главных преимуществ DateTime — поддержка временных зон.

// Указываем временную зону при создании
$moscow = new DateTime("now", new DateTimeZone("Europe/Moscow"));
echo $moscow->format("Y-m-d H:i:s"); // Московское время

// Изменение временной зоны
$newYork = new DateTime("now", new DateTimeZone("America/New_York"));
echo $newYork->format("Y-m-d H:i:s"); // Нью-Йоркское время

// Список доступных зон: https://www.php.net/manual/ru/timezones.php

Сравнение дат

$date1 = new DateTime("2024-01-01");
$date2 = new DateTime("2024-12-31");

if ($date1 < $date2) {
    echo "Первая дата раньше второй";
}

// Разница между датами
$diff = $date1->diff($date2);
echo $diff->days;    // 365
echo $diff->format("%m месяцев, %d дней"); // 11 месяцев, 30 дней

Изменение дат: modify, add, sub

$date = new DateTime("2024-01-01");

// Добавляем 10 дней
$date->modify("+10 days");
echo $date->format("Y-m-d"); // 2024-01-11

// Используем DateInterval
$interval = new DateInterval("P2M15D"); // 2 месяца 15 дней
$date->add($interval);
echo $date->format("Y-m-d"); // 2024-03-26

// Вычитание
$date->sub(new DateInterval("P1M"));
echo $date->format("Y-m-d"); // 2024-02-26

3. Парсинг строк: strtotime() и createFromFormat()

Часто даты приходят из внешних источников (формы, API, базы данных) в виде строк. Для их преобразования в timestamp или объект DateTime используются strtotime() и DateTime::createFromFormat().

Функция strtotime()

Умеет "понимать" текстовые описания дат.

$timestamp = strtotime("next Monday");
echo date("Y-m-d", $timestamp);

$timestamp = strtotime("last day of february 2024");
echo date("Y-m-d", $timestamp); // 2024-02-29 (високосный год)

$timestamp = strtotime("+2 weeks 3 days");
echo date("Y-m-d", $timestamp); // Через 17 дней от сегодня

Внимание: strtotime() работает только с английскими текстовыми форматами. Для

Блоги

Рекомендаций по книгам