Wordpress: strtotime() возвращает вчерашний день

Есть задача подтянуть на сайт прогноз погоды с Яндекса. Дата там выводится в формате <time class="time forecast-briefly__date" datetime="2021-10-22 00:00+0300">22 окт</time>.

  1. Заношу в $date значение атрибута datetime "2021-10-22 00:00+0300"
  2. Дату в виде "день.месяц" получаю с помощью date('d.m', strtotime($date))
  3. День недели, соответственно, через strftime('%a', strtotime($date))

На тестовой обычной php-странице (без движка) всё выводится и отображается корректно: 22.10, Fri. Но когда переношу этот код на главную страницу сайта под Wordpress, то получаю вчерашний день: 21.10, Thu (все остальные данные подтягиваются правильно, на сегодняшнюю дату).

Проблема, конечно, решается прибавлением суток к дате strtotime($date)+86400, но это явный "костыль".

Подскажите, почему в Wordpress'е некорректно отрабатывает strtotime($date)? И, может быть, есть какой-то другой способ получения нужных мне данных из datetime="2021-10-22 00:00+0300"?


Ответы (2 шт):

Автор решения: Егор Банин

Такие функции как date, strftime должны знать в каком часовом поясе вы их вызываете. Чтобы управлять часовым поясом, есть функция date_default_timezone_set. Вордпрес скорее всего вызывает её и устанавливает в соответствии с конфигом сайта.

Разберитесь как вы теряете информацию о часовом поясе:

  1. strtotime("2021-10-22 00:00+0300") вернёт метку времени -- абсолютное значение времени без часового пояса (больше у вас не московское время)
  2. date('d.m', strtotime($date)) вернёт относительную дату с часовым поясом, будет использован часовой пояс по умолчанию (который может отличаться от того что в php.ini после вызова date_default_timezone_set)
<?php

$ts = strtotime('2021-10-22 00:00+0300');

date_default_timezone_set('UTC');
echo date('Y.m.d H:i:s', $ts), "\n";

date_default_timezone_set('Europe/Moscow');
echo date('Y.m.d H:i:s', $ts), "\n";

Я загуглил, таймзона выставляется через админский интерфейс Settings -> Timezone. Убедитесь, что там у вас правильный часовой пояс.

→ Ссылка
Автор решения: KAGG Design

Функция date в WordPress не рекомендуется к использованию, потому что в зависимости от установок часового пояса может выдавать неверные результаты. Если бы вы пользовались Code Sniffer и стандартами кодирования WPCS, вы бы получили предупреждение ещё на этапе написания кода.

введите сюда описание изображения

Вам надо использовать функцию wp_date(). Ниже пример кода с date и wp_date на сайте, где в качестве timezone установлено UTC+3.

введите сюда описание изображения

→ Ссылка