Компонент Date/Time включает в себя все операции ввода, вывода и хранения информации о времени и дате в WordPress. Код написан давно еще в версии PHP 4, с тех пор было много изменений, самые значительные из них были в WordPress 5.3.
Давайте рассмотрим как сейчас работают Дата/Время и что было сделано в WordPress 5.3. Если коротко, то было сделано:
Стабильная и корректная работа всего существующего кода связанного с датами и временем. Исправлены ошибки, добавлены модульные тесты и исправлена встроенная
документация для многих функций.С WP 5.3+ появились новые функции Date API для удобства и совместимости с PHP.
- Улучшен код благодаря новым возможностям PHP 5.6 (напомню теперь это минимальная версия для WP).
Новые функции API
Единый способ получения часового пояса
wp_timezone_string() - единый способ получения часового пояса сайта, независимо от настроек (опции
timezone_string
/gmt_offset
).Функция вернет строку
Region/Location
, напримерAsia/Tashkent
или строку вида±NN:NN
, например+02:00
. Оба варианта действительны для версий PHP.- wp_timezone() извлекает часовой пояс сайта в виде объекта DateTimeZone.
Новая локализация даты
- wp_date() - основная функция - это полная переработка локализации даты в WordPress. Она работает с временными метками Unix и объектами PHP time zone, например DateTimeZone.
Взаимодействие с PHP
current_datetime() - получает текущий момент времени в виде объекта DateTimeImmutable.
get_post_datetime() - получает время поста как объект DateTimeImmutable.
- get_post_timestamp() - получает время поста как временную метку Unix -
1270995315
.
Отказ от временных меток WP
WP Date/Time API полагался на так называемую "временную метку WordPress" - WP timestamps
- сумму временной метки Unix со смещением часового пояса. Это вызывало множество ошибок и отсутствие совместимости с предыдущими версиями PHP или любыми внешними системами. В документации ошибочно говорилось о метках Unix, когда на самом деле использовались метки WP timestamps
.
Невозможно удалить метки WP без нарушения обратной совместимости. Но разработчики достигли значительного прогресса, чтобы:
- сократить их использование в ядре;
- исправить некорректную документацию;
- предложить новый API, использующий настоящие временные метки Unix.
Таким образом с версии WP 5.3:
Не рекомендуется:
НЕ получайте время как метка
WP timestamps
(метка времени + сдвижка времени сайта):НЕ локализуйте время/дату функцией:
НЕ сохраняйте на постоянной основе
WP timestamps
.НЕ сравнивайте
WP timestamp'ы
.- НЕ изменяйте временную зону PHP с помощью функции date_default_timezone_set() - это важное требование для правильной работы ядра.
Рекомендуется:
Получайте время как
Unix timestamp
(метка времени Unix без сдвижки) или как объект DateTimeImmutable:Локализуйте время/дату базируясь на Unix timestamp:
Сохраняйте
Unix timestamps
или форматы, которые точно указывают момент времени, например DATE_RFC3339.Сравнивайте метки времени Unix, объекты DateTimeImmutable или строковые даты в единой временной зоне.
- Используйте объекты: DateTimeZone и DateTimeImmutable с функцией wp_date(), когда нужно получить время во временной зоне отличной от зоны сайта).
--