Перейти к содержимому

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

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

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

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

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

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

php
<?php

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

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

Как использовать функцию 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
<?php

$timestamp = strtotime("2023-03-03"); // returns a Unix timestamp
$timestamp = strtotime("03/03/2023 12:34:56"); // returns a Unix timestamp
$timestamp = strtotime("2023.03.03 3:45:00 PM -0800"); // returns a Unix timestamp
$timestamp = strtotime("last Sunday"); // returns a Unix timestamp (assuming today is March 3, 2023)
echo $timestamp = strtotime("next month", strtotime("2023-03-15")); // returns a Unix timestamp

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

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

Конечно, вот несколько советов и лучших практик, которым следует придерживаться при использовании функции 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 в основном для унаследованного кода или простого парсинга относительных дат.

Заключение

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


Практика

Какова цель функции 'strtotime' в PHP?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.