Как получить настройку часового пояса WordPress?

50

Может кто-нибудь сказать мне, как получить часовой пояс, который установлен в админке WordPress?

Например, если блог настроен на восточное время, мне нужно распечатать эту точную строку:

US / Eastern

Это для функции, которая живет в functions.php в моей теме.

user1462
источник

Ответы:

79

если вам нужен gmt_offset тогда

<?php echo get_option('gmt_offset'); ?>

это даст вам целое число, например 2 или -2 .

и если вам нужна строка часового пояса, используйте

<?php echo get_option('timezone_string'); ?>

это даст вам строку, как Америка / Индианаполис

Bainternet
источник
6
Моя строка timezone_string находится в базе данных, но она пуста, даже после выбора другого часового пояса на странице настроек. В чем может быть дело? (WP3.6)
user2019515
Gmt_offest учитывает переход на летнее время в зависимости от настроек часового пояса сайта?
Squarecandy
6
@ user2019515 Если вы выберете город в качестве часового пояса, он будет сохранен в параметре «timezone_string», но если вы выберете ручное смещение (например, UTC + 1), он будет сохранен в параметре «gmt_offset» (как «1») и timezone_string остается пустым.
Беренд
15

Неудачная ситуация заключается в том, что действительно есть два разных варианта:

  1. Более новый timezone_string, который сохраняет часовой пояс в стиле PHP.
  2. Более старый gmt_offset, который сохраняет числовое смещение в часах.

Но в более новых средах timezone_stringфактически переопределяет gmt_offset , значение, возвращаемое последним, будет основано на первом. Однако обратное неверно - gmt_offsetможет быть допустимо, пока timezone_stringпусто.

Я потратил довольно много времени на эти вещи, и наиболее актуальный подход, который я реализовал в моей WpDateTimeбиблиотеке , следующий:

class WpDateTimeZone extends \DateTimeZone {
    /**
     * Determine time zone from WordPress options and return as object.
     *
     * @return static
     */
    public static function getWpTimezone() {
        $timezone_string = get_option( 'timezone_string' );
        if ( ! empty( $timezone_string ) ) {
            return new static( $timezone_string );
        }
        $offset  = get_option( 'gmt_offset' );
        $hours   = (int) $offset;
        $minutes = abs( ( $offset - (int) $offset ) * 60 );
        $offset  = sprintf( '%+03d:%02d', $hours, $minutes );
        return new static( $offset );
    }
}

Это попытается создать значимый объект часового пояса во всех возможных случаях, если доступна какая-либо информация.

Rarst
источник
1
Это должен быть принятый ответ. Люди будут сталкиваться с ошибками, если они полагаются исключительно на get_option ('timezone_string').
DiscoInfiltrator
Это правильный ответ.
Лукас Бустаманте
Не является ли использование в (int)течение $ часов и floor$ минут проблематичным? Согласно документации, (int)и floorпочти то же самое , за исключением (int)будет круглый -4,5 до -4 и floorокругляет его до -5. Похоже, это даст неправильные отрицательные смещения часового пояса?
Mikepote
1
@Mikepote Да, это было исправлено в библиотеке давным-давно, просто устаревшая копия кода в ответе здесь.
самое раннее
Боже мой, почему они реализовали это так ... Это стоило мне целый час наклона
Blackbam
9

Проверьте страницу ссылок на опции . Опция gmt_offsetвозвращает целое число. Например, если часовой пояс установлен на восточное время (например, America / New_York), gmt_offsetдолжно быть -5.

Трэвис Норткатт
источник
2

Не думайте, что вы получите строку типа US / Eastern без сохранения всех строк, которые вы хотите, в массиве и ссылки на них. Используя PHP, вы можете получить сокращение часового пояса, т.е. EST ; и если у вас есть эти значения, хранящиеся в массиве со строками, которые вы хотите, вы можете посмотреть их.

<?php date_default_timezone_set(get_option('timezone_string'));

      echo date('T'); // will give you three-character string like "EST"

      $timezones = array (
          'EST' => 'US/Eastern',
          'CST' => 'US/Central',
          // etc, etc, etc.
          );

      echo $timezones [ date('T') ]; // should be what you want.
 ?>
goldenapples
источник
Это не нужно. Стандарты часовых поясов были частью PHP с 5.2, как и объект DateTimeZone и связанные стандартные функции.
хаз
1

Чтобы добавить в Bainternet (я добавляю это как ответ, потому что я не могу комментировать - у меня меньше 50 очков в стеке разработки WP).

WordPress будет хранить строку часового пояса, только если вы выберете строку часового пояса в общих настройках. Выбор UTF - то, где это по умолчанию в списке, но вы можете прокрутить путь до строк часового пояса. Если вы установите строку часового пояса, то будут установлены как UTF, так и строка часового пояса. Они будут одинаковыми (то есть UTF будет сброшен в новую зону при выборе строки часового пояса timezone).

(WordPress 4)

Джефф
источник
0

Есть несколько вариантов, ни один из которых не работает отлично. Это ошибка WordPress, и она действительно отстой, потому что время не подходит, если вы не установите свой сайт на UTC ... что сбивает с толку и не всегда даже возможно.

Этот следующий код, я думаю, работает только в том случае, если вы выберете часовой пояс («Настройки» -> «Общие в админке») в качестве названного города вместо смещения номера по Гринвичу. Я не проверял это, но вполне возможно, что get_option('gmt_offset')установлен, когда get_option('timezone_string')нет.

date_default_timezone_set(get_option('timezone_string'));

Недостатком этого является то, что WordPress предполагает, что PHP установлен на UTC при создании меток времени mysql, так что вы можете немного испортить свою базу данных при каждом переключении часовых поясов! Не говоря уже о других плагинах WP, можно предположить, что среда PHP всегда находится в UTC.

Итак, если вы просто хотите указать правильное время - вы можете принудительно установить временную метку в UTC с помощью:

get_post_time('c', true); //should work for non-post objects.

К сожалению, хотя это правильно, часовой пояс будет установлен на UTC.

И заметьте , что вы не можете одновременно использовать «истинный» флаг и функции в timezone_set по умолчанию.

Любое правильное решение - это фрагмент кода, который учитывает оба gmt_offsetAND timezone_stringи использует их для установки часового пояса для некоторого ввода. WP предполагает, что PHP устанавливает UTC при выполнении меток времени mysql, и это может нарушить работу других плагинов.

На https://www.skyverge.com/blog/down-the-rabbit-hole-wordpress-and-timezones/ есть одно такое решение, но, опять же, это ошибка, поэтому вы должны использовать get_post_time($date_format, TRUE)код, чтобы получить временную метку, которая на самом деле правильно.

Райан Тейлор
источник
0

Учитывая тот факт, что WordPress сохраняет строку часового пояса в таблице параметров, вы можете использовать объектно-ориентированный способ получить правильное время на вашем WordPress сайте:

$tz = new DateTimeZone(get_option('timezone_string'));
$dt = new DateTime("now", $tz);

$page .= "<p> DateTime " . $dt->format("Y-m-d H:i:s") . "</p>";
Пол Бергквист
источник