Date/Time в WordPress
Компонент Date/Time включает в себя все операции ввода, вывода и хранения информации о времени и датах в WordPress.
Код WP для работы со временем и куча связанных функций написаны давно, еще с версии PHP 4. В работе таких функций было много недочетов и багов в версии WordPress 5.3 многие из них были исправлены. Все исправить очень сложно из-за обратной совместимости.
Над кодом связанным с работой со временем в ВП, который был выпущен в версии 5.3 работали больше года. Давайте рассмотрим как сейчас работают Дата/Время и что было сделано в WordPress 5.3. Если коротко, то было сделано:
-
Стабильная и корректная работа всего существующего кода связанного с датами и временем. Исправлены ошибки, добавлены модульные тесты и исправлена встроенная документация для многих функций.
-
С WP 5.3+ появились новые функции Date API для удобства и совместимости с PHP.
- Улучшен код благодаря новым возможностям PHP 5.6. Напомню, теперь это минимальная версия для WP.
Смотрите Форматы даты и времени в WordPress.
Новые функции 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
-
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
(метка времени + сдвижка времени сайта):- current_time( 'timestamp' ) или
current_time( 'U' )
- get_post_time( 'U' )
- current_time( 'timestamp' ) или
-
НЕ локализуйте время/дату функцией:
-
НЕ сохраняйте на постоянной основе
WP timestamps
. -
НЕ сравнивайте
WP timestamp'ы
. - НЕ изменяйте временную зону PHP через date_default_timezone_set() - это важное требование для правильной работы ядра. По умолчанию в ВП устанавливается
date_default_timezone_set( 'UTC' )
и эта установка не должна никогда меняться!
Рекомендуется:
Ниже указаны форматы DATE_RFC3339.
-
Получайте время как
Unix timestamp
(метка времени Unix без сдвижки) или как объект DateTimeImmutable: -
Локализуйте время/дату базируясь на Unix timestamp:
- wp_date( DATE_RFC3339 ) - это тоже самое что wp_date( DATE_RFC3339, time() ).
-
Сохраняйте
Unix timestamps
или форматы, которые точно указывают момент времени, например DATE_RFC3339. -
Сравнивайте метки времени Unix, объекты DateTimeImmutable или строковые даты в единой временной зоне.
- Используйте объекты: DateTimeZone и DateTimeImmutable с функцией wp_date(), когда нужно обработать время во временной зоне отличной от зоны сайта).
--
Источник: https://make.wordpress.org/core/2019/09/23/date-time-improvements-wp-5-3/