W3docs

Функция PHP strtotime: разбор даты и времени

Узнайте, как использовать функцию PHP strtotime для преобразования строк даты и времени в метку Unix с примерами и советами.

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

Что такое функция strtotime?

Функция strtotime — это встроенная функция PHP, которая преобразует строковое представление даты и/или времени в метку времени Unix (Unix timestamp) — числовое значение, представляющее количество секунд, прошедших с 1 января 1970 года, 00:00:00 UTC (Всемирное координированное время). Метка времени Unix — широко используемый формат для хранения и обработки дат и времени во многих языках программирования и системах; он позволяет легко сравнивать, вычислять и форматировать даты и время.

Синтаксис функции strtotime выглядит следующим образом:

Синтаксис функции strtotime()

<?php

strtotime ( string $time [, int $now = time() ] ) : int|false

где $time — входная строка, содержащая дату и/или время для разбора, а $now — необязательный параметр, задающий опорную метку времени для относительных вычислений. Функция возвращает метку времени Unix, если входная строка корректна, или false, если строку не удаётся разобрать.

Поскольку возвращаемое значение представляет собой просто количество секунд, его почти всегда используют вместе с date(), чтобы преобразовать обратно в читаемый вид:

<?php

date_default_timezone_set('UTC');

$timestamp = strtotime("2023-03-03");
echo $timestamp;                                  // 1677801600
echo date("Y-m-d H:i:s", $timestamp);             // 2023-03-03 00:00:00

Как использовать функцию strtotime?

Функция strtotime поддерживает широкий диапазон входных форматов и модификаторов, которые можно комбинировать для разбора различных выражений даты и времени. Наиболее распространённые форматы и модификаторы:

  • Форматы дат: YYYY-MM-DD, MM/DD/YYYY, DD-MM-YYYY, YYYY.MM.DD и другие.
  • Форматы времени: HH:MM:SS, HH:MM, H:M:S AM/PM, HH:MM:SS +/-HHMM и другие.
  • Смещения часового пояса: +HHMM, -HHMM, Z и другие.
  • Относительные выражения: now, yesterday, today, tomorrow, last/next day/week/month/year, +/- N days/weeks/months/years, first/last day/weekday/week/month/year of month/year и другие.

Для использования функции strtotime необходимо передать строку, содержащую один или несколько из этих форматов и модификаторов, и функция попытается интерпретировать и преобразовать их в метку времени Unix. Вот несколько примеров:

Как использовать функцию strtotime?

php— editable, runs on the server

Как видно, функция strtotime умеет обрабатывать различные входные форматы и относительные выражения, однако важно учитывать, что поведение функции может варьироваться в зависимости от часового пояса системы, версии PHP и синтаксиса и контекста входной строки. Поэтому рекомендуется использовать функцию strtotime осторожно и всегда проверять и валидировать результат перед использованием в продакшн-коде.

Арифметика относительных дат

Одна из наиболее полезных возможностей strtotime() — разбор относительных выражений относительно базовой метки времени. Это делает тривиальными вопросы «какая дата будет через неделю?» или «первый день следующего месяца»:

<?php

date_default_timezone_set('UTC');

$base = strtotime("2023-03-03");

echo date("Y-m-d", strtotime("+1 week", $base));                  // 2023-03-10
echo date("Y-m-d", strtotime("first day of next month", $base));  // 2023-04-01

Обработка возвращаемого значения false

strtotime() возвращает false (а не исключение), когда не может распознать входные данные. Обратите внимание, что false нестрого равно 0, поэтому всегда проверяйте результат с помощью строгого оператора === — иначе неудачный разбор можно принять за начало эпохи (1 января 1970 года):

<?php

$timestamp = strtotime("not a real date");

var_dump($timestamp);             // bool(false)

if ($timestamp === false) {
    echo "Could not parse the date.";
} else {
    echo date("Y-m-d", $timestamp);
}

Советы и лучшие практики

Вот несколько советов и лучших практик, которым следует придерживаться при использовании функции strtotime в PHP-коде:

  1. Всегда очищайте и валидируйте пользовательский ввод: поскольку функция strtotime принимает пользовательский ввод в виде строки, важно убедиться, что входные данные корректны и безопасны. Для фильтрации нежелательных символов и защиты от инъекций можно использовать функции trim, strip_tags, htmlspecialchars и регулярные выражения.
  2. Используйте явные форматы и часовые пояса: во избежание неоднозначности и ошибок рекомендуется применять явные форматы даты и времени, например ISO 8601, и явно указывать часовой пояс — в виде строки или объекта DateTimeZone. Это можно сделать с помощью функций date, gmdate, DateTime, DateTimeImmutable и DateTimeZone.
  3. Тестируйте и отлаживайте код: чтобы убедиться, что функция strtotime работает так, как ожидается, нужно проверять её с различными входными строками, граничными случаями и сценариями, а также сравнивать результат с ожидаемым. Для отладки и поиска ошибок можно использовать инструменты var_dump, print_r и assert.
  4. Рассмотрите использование альтернативных библиотек для работы с датой и временем: хотя функция strtotime удобна и мощна, у неё есть ряд ограничений и особенностей, которые могут вызывать проблемы в определённых ситуациях. Поэтому стоит рассмотреть использование альтернативных библиотек — например, Carbon или Chronos, — предлагающих больше возможностей и гибкости.

Примечание о современном PHP: для новых проектов настоятельно рекомендуется использовать классы DateTime и DateTimeImmutable вместо strtotime — они обеспечивают бо́льшую надёжность, объектно-ориентированный подход и явную работу с часовыми поясами. Функцию strtotime следует применять главным образом в унаследованном коде или для простого разбора относительных дат. Смотрите date_create и date_modify для объектно-ориентированных аналогов.

Связанные функции

  • date — форматирует метку времени Unix в читаемую строку.
  • mktime — строит метку времени из отдельных частей даты вместо строки.
  • time — возвращает текущую метку времени Unix.
  • date_create — современный объектно-ориентированный способ разбора дат.
  • PHP Date and Time — обзор инструментов PHP для работы с датой и временем.

Заключение

В этой статье мы рассмотрели функцию strtotime в PHP и её применение для разбора строк даты и времени и работы с ними. Мы разобрали принцип работы функции, поддерживаемые форматы и модификаторы, а также советы и лучшие практики её использования в коде. Применяя эти принципы, вы сможете улучшить навыки PHP-программирования и писать более надёжный код для работы с датами. Не забывайте всегда валидировать и очищать пользовательский ввод, использовать явные форматы и часовые пояса, тестировать и отлаживать код, а при необходимости рассматривать альтернативные библиотеки. Удачного кодирования!

graph TD;
A[strtotime Function] --> B[Unix timestamp];
B --> C[Date comparison];
B --> D[Date calculation];
B --> E[Date formatting];
C --> F[Equal to];
C --> G[Greater than];
C --> H[Less than];
D --> I[Addition];
D --> J[Subtraction];
E --> K[Textual representation];
E --> L[Numeric representation];

Практика

Практика
Какова цель функции 'strtotime' в PHP?
Какова цель функции 'strtotime' в PHP?
Was this page helpful?