time()
Функции даты и времени PHP: time(), date(), strtotime(), DateTimeImmutable, DateInterval и DateTimeZone с примерами и справочником форматов.
Введение
PHP предоставляет богатый набор функций для работы с датой и временем, необходимых при обработке временных данных: ведении журналов событий, планировании задач, вычислении продолжительности и отображении локализованных дат. В этом руководстве рассматриваются наиболее часто используемые инструменты — time(), date(), strtotime() и современный объектный API DateTimeImmutable / DateInterval / DateTimeZone — с их синтаксисом и практическими выполняемыми примерами.
Несколько концепций, которые нужно знать заранее:
- Unix-временная метка — это целое число, отсчитывающее секунды с 1 января 1970 года 00:00:00 UTC («эпоха»). Она не зависит от часового пояса, что делает её идеальной для хранения и сравнения моментов времени.
- Строка формата преобразует временную метку в удобочитаемую строку. Каждый символ (
Y,m,d,H, …) соответствует компоненту даты. - PHP отображает даты, используя часовой пояс сервера по умолчанию. Устанавливайте его явно, чтобы избежать неожиданностей:
<?php
date_default_timezone_set('UTC');Установка часового пояса заранее делает date() и time() детерминированными на всех серверах. Для более подробного введения см. PHP Date and Time.
Функция date() в PHP
Функция date() форматирует временную метку в удобочитаемую строку. Она принимает два параметра: format (обязательный) и timestamp (необязательный, по умолчанию — текущее время). Строка формата использует специальные символы для представления компонентов даты.
Пример функции date() в PHP
В этом примере Y, m и d представляют четырёхзначный год, двузначный месяц и двузначный день соответственно. Строка формата поддерживает множество других символов для часов, минут, секунд и не только.
Часто используемые символы формата
| Символ | Значение | Пример |
|---|---|---|
Y | Год, 4 цифры | 2023 |
y | Год, 2 цифры | 23 |
m | Месяц, с ведущим нулём | 03 |
n | Месяц, без ведущего нуля | 3 |
d | День месяца, с ведущим нулём | 03 |
j | День месяца, без ведущего нуля | 3 |
H | Час, 24ч, с ведущим нулём | 14 |
g | Час, 12ч, без ведущего нуля | 2 |
i | Минуты | 09 |
s | Секунды | 05 |
A | AM/PM | PM |
l | Полное название дня | Friday |
D | Сокращённое название дня | Fri |
F | Полное название месяца | March |
T | Аббревиатура часового пояса | UTC |
Передайте второй аргумент для форматирования любой временной метки, а не только «сейчас»:
<?php
date_default_timezone_set('UTC');
echo date("l, F j, Y", 1678838400); // outputs "Wednesday, March 15, 2023"Чтобы экранировать буквальный символ, не интерпретируя его как символ формата, поставьте перед ним обратный слэш (например, date('jS \o\f F')). Дополнительные параметры форматирования см. в date() и date_format().
Функция time() в PHP
Функция time() возвращает текущую Unix-временную метку — количество секунд, прошедших с 1 января 1970 года 00:00:00 UTC.
Как использовать функцию time() в PHP?
Возвращаемое целое число можно передавать непосредственно в date() или другие функции для работы со временем. Поскольку временная метка — это просто число, над ней можно выполнять арифметические операции — например, добавить 86400 (количество секунд в сутках), чтобы получить «то же время завтра»:
<?php
date_default_timezone_set('UTC');
$tomorrow = time() + 86400; // 24 * 60 * 60 seconds
echo date("Y-m-d H:i:s", $tomorrow);Для работы с датами, учитывающей месяцы, високосные годы и переход на летнее время, предпочтительнее использовать объектный API, описанный ниже, а не арифметику с секундами.
Функция strtotime() в PHP
Функция strtotime() разбирает текстовое описание даты и времени на английском языке и преобразует его в Unix-временную метку. Она принимает один строковый аргумент.
Пример функции strtotime() в PHP
Это преобразует указанную строку с датой и временем в соответствующее значение Unix-временной метки. strtotime() также понимает относительные выражения, что удобно для планирования:
<?php
date_default_timezone_set('UTC');
echo date("Y-m-d", strtotime("next monday")), "\n";
echo date("Y-m-d", strtotime("2023-03-03 +1 week")); // outputs "2023-03-10"Если строку не удаётся разобрать, strtotime() возвращает false, поэтому всегда проверяйте результат перед его использованием.
Класс DateInterval в PHP
Класс DateInterval представляет продолжительность между двумя датами или моментами времени. В современной разработке на PHP для вычисления интервалов, как правило, используется DateTimeImmutable, поскольку это позволяет избежать изменения исходного объекта даты.
Пример класса DateInterval в PHP
Этот код вычисляет разницу между двумя датами. Спецификатор формата %R%a выводит знак (+ или -), за которым следует общее количество дней.
Также можно создать DateInterval непосредственно из строки ISO 8601 duration и прибавлять или вычитать его из даты. P1W означает «период в одну неделю»:
<?php
$start = new DateTimeImmutable('2023-03-03');
$later = $start->add(new DateInterval('P1W'));
echo $later->format('Y-m-d'); // outputs "2023-03-10"Поскольку DateTimeImmutable никогда не изменяет исходный объект, $start по-прежнему указывает на 3 марта после вызова add(). Процедурные аналоги см. в date_add(), date_sub() и date_diff().
Функции работы с часовыми поясами в PHP
PHP работает с часовыми поясами через класс DateTimeZone и связанные методы. Они позволяют выполнять конвертацию между поясами и отображать смещения UTC.
Пример функций работы с часовыми поясами в PHP
Этот код выводит дату и время в указанном часовом поясе вместе с его аббревиатурой (например, EST).
Чтобы конвертировать существующий момент времени из одного пояса в другой, используйте setTimezone(). Сам момент времени не меняется — изменяется только его представление:
<?php
$ny = new DateTimeImmutable('2023-03-03 12:00:00', new DateTimeZone('America/New_York'));
$utc = $ny->setTimezone(new DateTimeZone('UTC'));
echo $utc->format('Y-m-d H:i:s T'); // outputs "2023-03-03 17:00:00 UTC"Нью-Йорк в марте отстаёт от UTC на пять часов, поэтому полдень в Нью-Йорке соответствует 17:00 UTC. Чтобы изменить часовой пояс, используемый процедурными функциями date() и time(), вызовите date_default_timezone_set().
Процедурный и объектный API: что выбрать
PHP предлагает два стиля работы с датами:
- Процедурные функции (
time(),date(),strtotime(), getdate(), gmdate()) лаконичны и отлично подходят для быстрого форматирования или разовых преобразований. - Объектный API (
DateTimeImmutable,DateInterval,DateTimeZone) — рекомендуемый выбор для задач, связанных с часовыми поясами, продолжительностью или арифметикой дат, поскольку он явный, неизменяемый и избавляет от подводных камней целочисленной арифметики секунд при переходе на летнее время.
Практическое правило: обращайтесь к DateTimeImmutable всякий раз, когда дата пересекает часовой пояс или требует сложения/вычитания.
Заключение
Владение функциями PHP для работы с датой и временем позволяет разработчикам точно обрабатывать временные данные в разных средах и часовых поясах. Начните с time() и date() для простых случаев, используйте strtotime() для разбора пользовательского ввода и применяйте семейство DateTimeImmutable для надёжной арифметики дат.