Wordpress: strtotime() возвращает вчерашний день
Есть задача подтянуть на сайт прогноз погоды с Яндекса. Дата там выводится в формате <time class="time forecast-briefly__date" datetime="2021-10-22 00:00+0300">22 окт</time>.
- Заношу в $date значение атрибута datetime "2021-10-22 00:00+0300"
- Дату в виде "день.месяц" получаю с помощью
date('d.m', strtotime($date)) - День недели, соответственно, через
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. Вордпрес скорее всего вызывает её и устанавливает в соответствии с конфигом сайта.
Разберитесь как вы теряете информацию о часовом поясе:
- strtotime("2021-10-22 00:00+0300") вернёт метку времени -- абсолютное значение времени без часового пояса (больше у вас не московское время)
- 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. Убедитесь, что там у вас правильный часовой пояс.
Функция date в WordPress не рекомендуется к использованию, потому что в зависимости от установок часового пояса может выдавать неверные результаты. Если бы вы пользовались Code Sniffer и стандартами кодирования WPCS, вы бы получили предупреждение ещё на этапе написания кода.
Вам надо использовать функцию wp_date(). Ниже пример кода с date и wp_date на сайте, где в качестве timezone установлено UTC+3.

