Date/Time в WordPress

Компонент Date/Time включает в себя все операции ввода, вывода и хранения информации о времени и датах в WordPress.

Код WP для работы со временем и куча связанных функций написаны давно, еще с версии PHP 4. В работе таких функций было много недочетов и багов в версии WordPress 5.3 многие из них были исправлены. Все исправить очень сложно из-за обратной совместимости.

Над кодом связанным с работой со временем в ВП, который был выпущен в версии 5.3 работали больше года. Давайте рассмотрим как сейчас работают Дата/Время и что было сделано в WordPress 5.3. Если коротко, то было сделано:

  1. Стабильная и корректная работа всего существующего кода связанного с датами и временем. Исправлены ошибки, добавлены модульные тесты и исправлена встроенная
    документация для многих функций.

  2. С WP 5.3+ появились новые функции Date API для удобства и совместимости с PHP.

  3. Улучшен код благодаря новым возможностям 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.

Функция date_i18n() теперь считается устаревшей и работает на основе wp_date().

Взаимодействие с PHP

Отказ от временных меток 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(), когда нужно обработать время во временной зоне отличной от зоны сайта).

--

Источник: https://make.wordpress.org/core/2019/09/23/date-time-improvements-wp-5-3/