Урок 20: Работа с датой и временем на PHP

В этом уроке мы поговорим о работе с датой и временем в PHP. Это важная тема, так как практически в каждом проекте приходится работать с временными данными. Отображать дату создания статьи, рассчитывать время до следующего события, форматировать время для пользователя и многое другое.

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

Функции для работы с датой в PHP

PHP предлагает множество инструментов для работы с датой и временем. Рассмотрим ключевые из них.

1. time() — текущая метка времени

Функция time() возвращает текущую Unix-метку. Количество секунд, прошедших с 1 января 1970 года (начало «эпохи Unix»). Это основа для многих операций с датой.

<?php
$currentTimestamp = time();
echo $currentTimestamp; // Выведет что-то вроде 1717024000
?>

Зачем это нужно?
Метки времени удобны для расчетов. Например, чтобы получить дату через 3 дня:

$futureDate = time() + (3 * 24 * 60 * 60); // +3 дня в секундах
echo date('Y-m-d', $futureDate); // Форматируем метку в читаемую дату

2. date() — форматирование даты

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

Синтаксис:

date(string $format, ?int $timestamp = null): string

Пример:

php
echo date('d.m.Y H:i:s'); // 28.05.2024 15:30:00

3. strtotime() — преобразование строки в метку времени

Функция strtotime() парсит текстовое описание даты/времени и возвращает соответствующую Unix-метку.

$timestamp = strtotime('next Monday');
echo date('Y-m-d', $timestamp); // Дата следующего понедельника

Поддерживаемые форматы:

  • tomorrow
  • +1 week
  • 2024-12-31
  • first day of next month

4. Класс DateTime — объектно-ориентированный подход

Современный способ работы с датами в PHP — использование класса DateTime. Он удобнее и гибче старых функций.

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

$date = new DateTime(); // Текущая дата и время
$date = new DateTime('2024-05-28 10:00:00'); // Конкретная дата

Методы класса:

  • modify() — изменяет дату согласно строковому описанию.
  • format() — возвращает дату в заданном формате.
  • add() и sub() — добавляет или вычитает интервал (объект DateInterval).

Пример:

$date = new DateTime();
$date->modify('+3 days');
echo $date->format('Y-m-d'); // Дата через 3 дня

Форматирование даты

Функция date() и метод format() класса DateTime используют спецификаторы формата. Приведу основные из них:

Спецификатор Описание Пример
d День месяца (с ведущим нулем) 01–31
j День месяца без нуля 1–31
m Месяц (с нулем) 01–12
n Месяц без нуля 1–12
Y Год (4 цифры) 2024
y Год (2 цифры) 24
H Часы (24-часовой формат) 00–23
i Минуты 00–59
s Секунды 00–59
D Сокращенное название дня Mon, Tue
l Полное название дня Monday
F Полное название месяца January

Примеры форматирования:

echo date('d F Y'); // 28 May 2024
echo (new DateTime())->format('H:i'); // 15:30

Практические задачи

Решите эти задачи, сверяясь с примерами.

Задача 1: Вывод текущей даты в разных форматах

Выведите текущую дату в форматах:

  • 28.05.2024
  • 2024-05-28 15:30
  • Среда, 28 мая 2024 г.

Решение:

echo date('d.m.Y'); // 28.05.2024
echo date('Y-m-d H:i'); // 2024-05-28 15:30
echo date('l, j F Y г.'); // Wednesday, 28 May 2024 г.

Задача 2: Разница между двумя датами

Рассчитайте, сколько дней осталось до Нового года.

Решение:

$currentDate = new DateTime();
$newYear = new DateTime('2024-12-31');
$interval = $currentDate->diff($newYear);
echo $interval->days . ' дней до Нового года!';

Задача 3: Добавление интервала к дате

Прибавьте к текущей дате 2 недели и 3 дня.

Решение через strtotime:

$futureDate = strtotime('+2 weeks 3 days');
echo date('Y-m-d', $futureDate);

Решение через DateTime:

$date = new DateTime();
$date->add(new DateInterval('P17D')); // P17D = период 17 дней
echo $date->format('Y-m-d');

Задача 4: Проверка корректности даты

Проверьте, является ли строка 2024-02-30 корректной датой.

Решение:

$date = '2024-02-30';
$isValid = DateTime::createFromFormat('Y-m-d', $date) !== false;
echo $isValid ? 'Дата корректна' : 'Дата неверна'; // Выведет «Дата неверна»

Задача 5: Вывод даты на русском языке

По умолчанию PHP выводит названия месяцев и дней на английском. Чтобы перевести их на русский, используйте setlocale() и strftime() (или массив замен).

Пример:

setlocale(LC_TIME, 'ru_RU.UTF-8');
echo strftime('%d %B %Y'); // 28 мая 2024

На некоторых серверах может потребоваться установка локали. Альтернативный вариант:

$months = [
    'January' => 'января', 
    // ... остальные месяцы
];
echo date('j ') . $months[date('F')] . date(' Y'); // 28 мая 2024

Часовые пояса

Работая с датами, всегда учитывайте часовой пояс. Иначе можете получить неожиданные результаты.

Установка часового пояса:

date_default_timezone_set('Europe/Moscow');
// Или в DateTime:
$date = new DateTime('now', new DateTimeZone('Europe/Moscow'));

Итоги 20-го урока

Сегодня мы изучили:

  1. Основные функции для работы с датой: time()date()strtotime().
  2. Объектно-ориентированный подход через класс DateTime.
  3. Форматирование даты с использованием спецификаторов.
  4. Решение практических задач: от расчета интервалов до локализации.

Всегда используйте DateTime вместо устаревших функций. Это удобнее и безопаснее, особенно при работе с часовыми поясами.

Если вы хотите изучить PHP с нуля, рекомендую ознакомиться с полным курсом по PHP для начинающих: курс по PHP для начинающих. В этом курсе вы найдете все уроки, практические задачи и примеры кода, которые помогут вам стать уверенным PHP-разработчиком.