Дата и время
Дата публикации, срок действия скидки, возраст пользователя — без дат не обходится ни один сайт. В PHP есть простая функция date() и более мощные объекты.
Текущая дата
Функция date() возвращает текущую дату в заданном формате. Буквы в строке формата заменяются частями даты:
<?php
$today = date('d.m.Y');
echo strlen($today); // 10Результат зависит от дня запуска — например, 30.01.2025.
Буквы формата
| Буква | Значение | Пример |
|---|---|---|
d | День с нулём | 05 |
m | Месяц с нулём | 01 |
Y | Год | 2025 |
H | Часы, 24-часовой формат | 14 |
i | Минуты | 07 |
s | Секунды | 30 |
N | День недели, 1 — понедельник | 4 |
Объект даты
Для вычислений удобнее объект DateTimeImmutable. В конструктор передают дату строкой:
<?php
$date = new DateTimeImmutable('2025-01-30 14:05');
echo $date->format('d.m.Y'), "\n"; // 30.01.2025
echo $date->format('H:i'); // 14:05Без аргумента объект содержит текущий момент.
Сложение и вычитание
Метод modify() сдвигает дату и возвращает новый объект:
<?php
$date = new DateTimeImmutable('2025-01-30');
echo $date->modify('+7 days')->format('d.m.Y'), "\n"; // 06.02.2025
echo $date->modify('-1 month')->format('d.m.Y'), "\n"; // 30.12.2024
echo $date->modify('last day of this month')->format('d.m.Y'); // 31.01.2025Исходный объект не меняется — в этом смысл слова Immutable.
Разница между датами
Метод diff() возвращает промежуток между двумя датами:
<?php
$start = new DateTimeImmutable('2025-01-01');
$finish = new DateTimeImmutable('2025-03-01');
$interval = $start->diff($finish);
echo $interval->days, "\n"; // 59
echo $interval->m; // 2Свойство days — полное число дней, m и d — месяцы и дни по отдельности.
Сравнение
Объекты дат сравнивают обычными операторами:
<?php
$deadline = new DateTimeImmutable('2025-06-01');
$now = new DateTimeImmutable('2025-05-20');
echo $now < $deadline ? 'Ещё есть время' : 'Срок прошёл';Дата из строки пользователя
createFromFormat() разбирает дату в известном формате и возвращает false, если строка не подошла:
<?php
$date = DateTimeImmutable::createFromFormat('d.m.Y', '30.01.2025');
echo $date ? $date->format('Y-m-d') : 'Неверная дата'; // 2025-01-30Частая ошибка
У PHP есть ещё класс DateTime, и его методы меняют сам объект. Переменная, которую вы считали «началом», незаметно изменится:
<?php
$start = new DateTime('2025-01-30');
$finish = $start->modify('+1 day');
echo $start->format('d.m.Y'); // 31.01.2025 — изменилось и началоИспользуйте DateTimeImmutable — с ним таких сюрпризов нет.